MVC:单击"提交"按钮时会调用哪些代码?

Sha*_*ica 14 c# asp.net asp.net-mvc

MVC新手问题; 我正在学习,而不是阅读手册...... :)

我看到当我创建一个"编辑"视图时,自动生成的视图包含一个"提交"按钮:

<input type="submit" value="Save" />
Run Code Online (Sandbox Code Playgroud)

但是在后台调用什么代码才能保存?具体来说,这个视图底层的模型在我想要调用的代码中有自己的花哨的保存逻辑.如何让视图调用我的代码,而不是在幕后无形地调用任何标准代码?

Iva*_*tev 14

不是定义发生了什么的按钮,而是表单本身.提交类型的按钮(每个表单一个)只触发表单提交,由表单本身处理.

表单有一个动作 - 例如:

<form name="input" action="users/save" method="post">
    <!-- Form content goes here -->
    <input type="submit" value="Submit" />
</form>
Run Code Online (Sandbox Code Playgroud)

该操作是一个URL,会发生的是浏览器收集表单(<input...>)中所有字段的值并将它们发布到指定的URL.

在ASP.NET中,MVC表单通常使用Html帮助程序定义,因此构建表单操作的URL将委托给ASP.NET MVC.对于上面的例子:

<% using(Html.BeginForm("Save", "Users")) %>
<% { %>
    <!-- Form content goes here -->
    <input type="submit" value="Save" />
<% } %>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,将创建一个网址/users/save,表单将发布到该网址.这将触发ASP.NET路由,它将处理/users/saveurl并将其分解为块,以便它知道它必须在"Users"控制器类上调用"Save"操作方法.然后,它将读取所有传入的字段名称 - 值对,并尝试将它们映射到方法参数名称(如果有).


Chr*_*ken 6

它会调用表单操作指向控制器上的任何公共操作方法.然后,您可以在视图模型上调用save.

    public virtual ActionResult Save(MyViewModel model) {
        model.Save();            

        --- more code to do stuff here
    }
Run Code Online (Sandbox Code Playgroud)

将表单操作设置为 MyController/Save

您还可以using (Html.BeginForm...在代码中使用将表单指向特定控制器上的特定操作方法.


Muh*_*hid 5

当您单击提交按钮时,请求进入HTTp模块,该模块将其指向相应的控制器操作.当从模板创建编辑视图时,表单的发布地址与编辑表单相同,即如果您正在访问/ home/edit,您可以在表单的开始标记中看到以下html

<form method="post" action="/home/edit">
Run Code Online (Sandbox Code Playgroud)

你可以有另一个只接受帖子请求的动作方法

[HttpPost]
public ActionResult Edit(int id, ViewModel model)
{
      //put your logic here handling submitted values
}
Run Code Online (Sandbox Code Playgroud)

HttpPost属性告诉它只处理post请求,而不是用于呈现表单的请求