【问题标题】:Mapping individual buttons on ASP.NET MVC View to controller actions将 ASP.NET MVC 视图上的单个按钮映射到控制器操作
【发布时间】:2010-05-30 04:18:34
【问题描述】:

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

  1. 将每一行放在它自己的表单标签中,然后当点击更新按钮时,它将只提交该行的值(也会有一个带有rowId的隐藏字段)并且控制器类将获取所有帖子值作为控制器上 Update 方法的参数。
  2. 不知何故,让按钮以某种方式编写脚本,以仅将带有 POST 的该行的值发送回控制器。

有没有办法做到这一点?我担心的一件事是,如果每一行都有不同的名称来分配由 ASP.NET 分配的控件(txtName1、txtDesc1、txtName2、txtDesc2),那么它们的值将如何映射到 Controller 方法的正确参数?

【问题讨论】:

  • 如果您使用按钮标签而不是输入,您可以分别设置值和显示文本,然后检查控制器中的值。

标签: asp.net-mvc


【解决方案1】:

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

<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 参数将自动映射到您在表单操作中输入的数字。

【讨论】:

  • 这个答案是正确的。我要补充一点,虽然元素名称可以而且应该为每个表单重复,但每个元素都应该有一个唯一的 ID。
  • 如果我为每一行使用 ASP.NET 用户控件,并且在控件中我使用 ASP.NET 文本框和按钮,是否可以执行整个重复名称、唯一 ID 的事情?
  • 或者你也可以创建一个简单的html按钮并在Controller的post方法上获取它的值:weblogs.asp.net/dfindley/archive/2009/05/31/…
【解决方案2】:

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

<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
}

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

【讨论】:

    【解决方案3】:

    正如 rodbv 所说,您想使用单独的 &lt;form&gt; 元素。

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

    Asp.net(标准)为许多使用 javascript 的标准 html 回发操作添加了一个包装器(__doPostback javascript 函数几乎无处不在),这添加了有关表单的哪个输入元素导致回发并将其传递给的信息服务器在一个隐藏的表单变量中。如果你真的愿意,你可以模仿这种行为,但我不建议这样做。

    在一个页面上“乱扔”许多&lt;form&gt; 可能看起来很奇怪,但这意味着回发到服务器的重量会更轻,并且应该让用户的一切运行得更快一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      • 1970-01-01
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多