【问题标题】:How do Delete view and action get the model id?Delete view 和 action 如何获取模型 id?
【发布时间】:2017-03-12 05:29:48
【问题描述】:

在标准的 MVC 应用程序中,带有视图的脚手架控制器会提供带有此 Razor 表单的 Delete 视图:

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()

    <div class="form-actions no-color">
        <input type="submit" value="Delete" class="btn btn-default" /> |
        @Html.ActionLink("Back to List", "Index")
    </div>
}

Delete 视图中没有任何id 字段,无论是否隐藏。

然后那个视图的控制器有这个动作:

[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(long id)
{
    ....
}

这个动作从哪里得到它的id 参数值?在某种模型绑定期间,它是否以某种方式从发布的唯一表单值(防伪令牌__RequestVerificationToken)中提取出来?

【问题讨论】:

    标签: asp.net asp.net-mvc http razor asp.net-mvc-5


    【解决方案1】:

    当您重定向到Delete 操作时,id 作为参数传递:

    [HttpGet]
    public ActionResult Delete(long id)
    {
        return View();
    }
    

    并且由于它是原始 url 的一部分(在显示删除视图时查看您的浏览器地址栏),它将由 Html.BeginForm() 助手保留 - 现在查看生成的 HTML 标记,您将看到这个:

    <form action="/somecontroller/delete/123" method="post">
        ...    
    </form>
    

    这就是 id 的来源 - 生成表单的操作。

    【讨论】:

    • 感谢您急需的复习,达林。
    【解决方案2】:

    因为你有一个带有签名的 GET 方法

    public ActionResult Delete(long id)
    

    而您使用默认路由(或至少包含/{id} 的路由定义)

    url: "{controller}/{action}/{id}"
    

    当您导航到该方法时,例如使用/yourController/Delete/10id 的值是10,并添加到由您的Html.BeginForm() 方法生成的&lt;form&gt; 标记的action 属性中.当您提交表单时,id 参数的值与表单 action 属性中的路由值绑定(DefaultModelBinder 从表单集合(您可能拥有的任何输入)中读取值以及路由值和查询字符串(等等)

    【讨论】:

    • 啊,是的,我曾经知道活页夹使用了所有值,但在某个地方迷失了方向,并假设它仅将表单数据用于发布请求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 2016-01-02
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多