在ASP.NET MVC表单上允许多个按钮的最佳方法是什么?

时间:2008-12-17 22:54:21

标签: asp.net html asp.net-mvc

我有一种感觉,我对此过于“网状”,但无论如何我都会问。我在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视图中允许单个表单和多个按钮的最佳方法是什么?或者,我应该以某种方式将我的观点分解为多种形式吗?

4 个答案:

答案 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上很重。)