我有一种感觉,我对此过于“网状”,但无论如何我都会问。我在ASP.NET MVC项目中有一个表单,它有一些输入字段和两个按钮。一个按钮用于“过滤”其中一个列表框。另一个用于提交表单。我的观点看起来像这样:
<%using (Html.BeginForm())
{%>
<%=Html.TextBox("SearchItems") %>
<input type="submit" name="Command" value="Find" />
<%=Html.ListBox("SelectedItems", new MultiSelectList(model.AvailableItems,"Id", "Name", model.SelectedItems))%>
//Some other form fields.
<input type="submit" name="Command" value="Send" />
<%} %>
我的行动看起来像这样:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index([Bind(Prefix = "")]SendMessageRequest model)
{
if (model.Command == "Find")
return SearchItems(model);
if (model.Command == "Send")
return Send(model);
throw new Exception("Invalid command.");
}
这样可行 - 控制器根据单击的按钮选择正确的操作。但是,它并不理想,因为输入按钮的值也是显示的文本。如果我想翻译这个应用程序,那么行动就会破裂。为了解决这个问题,我可以使用&lt; button&gt;元素,允许文本和值不同。但是,这个应用程序适用于Pocket IE,显然Pocket IE处理这些不同 - 它为Command提交了两个值,这会破坏操作。
由于这是针对Pocket IE的,因此我对JavaScript的处理方式也非常有限。 Ajax已经出局,但我可以通过按钮'onClick设置隐藏字段。
所以,我的问题是在MVC视图中允许单个表单和多个按钮的最佳方法是什么?或者,我应该以某种方式将我的观点分解为多种形式吗?
答案 0 :(得分:5)
我会建议使用2种不同动作的多种形式。我认为这也更容易测试:
(c =&gt; c.Search(),FormMethod.Get); {%> 找 (c =&gt; c.Send(),FormMethod.Post); {%> 发送或类似的东西。然后在控制器中你有2个相应的动作。这意味着责任被打破了。使用MVC,您可以拥有多个表单,与Webforms不同。所以你可以挣脱!
答案 1 :(得分:1)
不需要隐藏字段,您可以在按钮的点击事件上设置表单的操作。
javascript(在jQuery中)类似于:
$("#myForm").attr("action", "mvcaction");
$("#myForm").submit();
你可以将它包装在一个标准函数中,该函数接受一个参数,例如动作。我们将它用于菜单表单对象中的标准菜单项,它运行良好。
编辑:不确定Pocket PC是否完全处理JQuery,但如果不能,则应该可以在常规javascript中执行上述操作。
答案 2 :(得分:1)
这是一篇非常好的文章,描述了多种按钮形式的所有替代方案:http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form.aspx
就我个人而言,我同意Odd,jQuery onclick动作似乎是最好的选择。
答案 3 :(得分:0)
我正在创建的应用程序需要大量使用,但多种形式的问题也会受到影响。
我们使用jQuery库中的$ .post()方法绕过它。
$("#update").click(function() {
$.post("/Register", { name: $("#firstName").val(),
surname: $("#surname").val(),
username: $("#email").val(),
accountName: $("#accountName").val(),
password: $("#password").val()
},
function(data) {
alert(data);
});
});
取消按钮发回更少的值。
$("#cancel").click(function() {
$.post("/Cancel", { username: $("#email").val(),
password: $("#password").val()
},
function(data) {
alert(data);
});
});
再次确定它依赖于启用javascript,但如果你要禁用javascript,你最好不要使用互联网(和我的应用程序'因为它会在js上很重。)