将ASP.NET MVC View上的各个按钮映射到控制器操作

时间:2009-01-02 19:17:16

标签: asp.net-mvc

我有一个应用程序,我需要用户能够更新或删除数据库中的数据行。使用我视图的.aspx文件中的foreach循环向用户显示行。每行将有两个文本字段(txtName,txtDesc),一个更新按钮和一个删除按钮。我不确定的是,如何让更新按钮将消息发送到控制器以更新哪一行?我可以看到几种方法:

  1. 将每一行放在其自己的表单标记中,然后单击更新按钮时,它将仅提交该行的值(还会有一个带有rowId的隐藏字段),控制器类将接受所有帖子值作为控制器上Update方法的参数。
  2. 不知何故,按钮的编写方式只能通过POST向控制器发回该行的值。
  3. 有没有办法做到这一点?我关心的一件事是,如果每一行都有不同的名称,它由ASP.NET分配的控件(txtName1,txtDesc1,txtName2,txtDesc2),那么它们的值将如何映射到Controller方法的正确参数?

3 个答案:

答案 0 :(得分:11)

您可以使用多个表单,并将表单上的操作设置为:

<form method="post" action="/YourController/YourAction/<%=rowId%>">

因此,您将拥有YourController/YourAction/1YourController/YourAction/2等等。

不需要为不同的文本框指定不同的名称,只需将它们称为txtName,txtDesc等(甚至更好,去掉那些txt前缀)。由于它们的形式不同,因此不会混淆。

然后在行动中你做了类似的事情

public ActionResult YourAction(int id, string username, string description)

其中,用户名,说明与您在表单控件上使用的名称相同(因此它们会自动映射)。 id参数将自动映射到您在表单操作上放置的数字。

答案 1 :(得分:4)

您还可以在表单上有多个“有效命名”按钮,如:

<input type="submit" value="Save" name="btnSave" id="btnSave"/>
<input type="submit" value="Delete" name="btnDelete" id="btnDelete" /

并检查您收到的提交内容。每个表单只能发送一个提交操作,因此就像所有其他提交按钮实际上并不存在一样:

if ( HttpContext.Request.Form["btnDelete"] != null ) {
    //Delete stuff
} elseif ( HttpContext.Request.Form["btnSave"] != null ) {
    //Update stuff
}

我还认为你可以实现一个自定义的ActionMethodSelectorAttribute,就像这里http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form.aspx一样(也在上面列出),以便有更清晰的代码。

答案 2 :(得分:0)

正如rodbv所说,你想要使用单独的<form>元素。

当您使用Asp.Net MVC或经典html(php,经典asp等)时,您必须忘记Asp.Net处理按钮按下的方式。当表单被发布回网络服务器时,服务器知道的只是“表单已发送,并包含以下输入元素”。

Asp.net(标准)使用javascript(几乎在所有地方都使用了__doPostback javascript函数)添加了许多标准html回发操作的包装器,并且这添加了有关表单的哪个输入元素导致回发并将其传递给服务器隐藏的形式变量。如果你真的如此渴望,你可以模仿这种行为,但我会反对它。

对于一个包含许多<form>的页面来说,“乱丢”似乎很奇怪,但是这意味着对服务器的回发将会更轻,并且应该使用户的所有内容运行得更快一些。 / p>