将ASP.NET MVC视图上的各个按钮映射到控制器操作
我有一个应用程序,我需要用户能够从数据库更新或删除数据行。这些行在我的视图的.aspx文件中使用foreach循环显示给用户。每行将有两个文本字段(txtName,txtDesc),一个更新按钮和一个删除按钮。我不确定的是,我如何让更新按钮将消息发送给控制器以更新哪一行?我可以看到这样做的几种方法:将ASP.NET MVC视图上的各个按钮映射到控制器操作
- 把每一行放在它自己的表单标签中,然后当点击更新按钮时,它只会提交该行的值(也会有一个隐藏字段与rowId)和控制器类将把所有后期值作为参数传递给控制器上的Update方法。
- 不知何故,让按钮被编写脚本,以只发送该行的值到POST的控制器。
有没有办法做到这一点?我关心的一件事是,如果每行对于由ASP.NET分配的控件(txtName1,txtDesc1,txtName2,txtDesc2)具有不同的名称,那么它们的值将如何映射到Controller方法的正确参数?
您可以使用多个表单,并设置表单上的动作是这样的:
<form method="post" action="/YourController/YourAction/<%=rowId%>">
所以,你将有YourController/YourAction/1
,YourController/YourAction/2
等。
有没有必要给不同的文本框不同的名称,只需将它们称为txtName,txtDesc等(或者更好,摆脱那些txt前缀)。由于它们有不同的形式,它们不会混淆。
然后在行动,你这样做
public ActionResult YourAction(int id, string username, string description)
凡的用户名,说明是你的表单控件(因此会自动映射)使用相同的名称。 id参数将自动映射到您在表单操作中添加的数字。
这个答案是正确的。我会补充一点,虽然元素名称可以并且应该是每个表单重复的,但每个元素都应该有唯一的ID。 – 2009-01-03 15:18:07
由于rodbv表示要使用单独的<form>
元素。
当你使用Asp.Net MVC或传统的HTML(PHP,经典的ASP等)时,你必须忘记Asp.Net处理按钮的方式。当一个表单被发回到web服务器时,所有服务器知道的仅仅是“表单已发送,并且包含以下输入元素”。
Asp.net(标准)在使用javascript(__doPostback javascript函数几乎在任何地方使用)中添加了许多标准html回发操作的封装,并且添加了有关表单的哪个输入元素导致回发并将其传递的信息以隐藏的形式变量到服务器。你可以模仿这种行为,如果你真的这么想,但我会建议反对它。
看起来有点奇怪,乱七八糟的页面上有很多<form>
,但是这意味着回发到服务器的重量会更轻,应该让所有的事情都能以更快的速度运行。
您也可以像在窗体上多个“有效的名为”按钮:
<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(也列在上面)具有更清晰的分离代码。
如果您使用按钮标签而不是输入,则可以分别设置值和显示文本,然后检查控制器中的值。 – 2012-10-03 06:23:35