我有一种感觉,我对此过于“网状”,但无论如何我都会问.我在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."); }
这样做 – 控制器根据单击的按钮选择正确的操作.但是,它并不理想,因为输入按钮的值也是显示的文本.如果我想翻译这个应用程序,那么行动就会破裂.为了解决这个问题,我可以使用< button>元素,允许文本和值不同.但是,这个应用程序是用于Pocket IE,显然Pocket IE处理这些不同 – 它提交Command的两个值,这打破了行动.
因为这是针对Pocket IE的,所以我对JavaScript的处理方式也非常有限. Ajax已经出局,但我可以通过按钮’onClick设置隐藏字段.
所以,我的问题是在MVC视图中允许单个表单有多个按钮的最佳方法是什么?或者,我应该以某种方式将我的观点分解为多种形式吗?
我会建议使用2种不同的动作的多种形式.我认为这也更容易测试:(c => c.Search(),FormMethod.Get);
{%>
找
(c => c.Send(),FormMethod.Post);
{%>
发送
或类似的东西.然后在控制器中你有2个相应的动作.这意味着责任被打破了.使用MVC,您可以拥有多个表单,与Webforms不同.所以你可以挣脱!