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

时间:2011-04-11 12:57:12

标签: c# asp.net asp.net-mvc

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

我在创建“编辑”视图时看到自动生成的视图包含“提交”按钮:

<input type="submit" value="Save" />

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

5 个答案:

答案 0 :(得分:12)

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

表单有一个动作 - 例如:

<form name="input" action="users/save" method="post">
    <!-- Form content goes here -->
    <input type="submit" value="Submit" />
</form>

操作是一个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" />
<% } %>

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

答案 1 :(得分:5)

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

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

        --- more code to do stuff here
    }

将表单操作设置为MyController/Save

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

答案 2 :(得分:5)

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

<form method="post" action="/home/edit">

您可以使用另一种仅接受

等帖子请求的操作方法
[HttpPost]
public ActionResult Edit(int id, ViewModel model)
{
      //put your logic here handling submitted values
}

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

答案 3 :(得分:3)

它调用form元素的action部分中定义的Action方法 例如:

<form action="/Account/LogOn" id="loginForm" method="post"> 

将以此表单

调用帐户控制器中的LogOn操作

答案 4 :(得分:0)

ViewPage顶部有一个BeginForm方法using (Html.BeginForm(),用于呈现FormTag。此方法有一个重载,它采用ActionName和控制器名称。因此,您可以在控制器中指定必须调用的操作。