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

3

我觉得我在这方面可能过于“WebForms”,但我还是要问一下。我在一个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.");
    }

这个方案是可行的——控制器根据被点击的按钮选择正确的操作。但这并不理想,因为输入按钮的值也是显示文本。如果我想翻译这个应用程序,那么操作将会出问题。为了解决这个问题,我可以使用
4个回答

5
我建议使用两个不同的操作来创建多个表单,我认为这样也更易于测试:
或者类似这样。然后在控制器中,你需要有两个相应的操作。这意味着职责得到了分解。在MVC中,你可以拥有多个表单,这与Webforms不同。所以你可以自由地分解!

这应该能解决支持Javascript的问题。 - Trevor de Koekkoek
这种方法的问题在于,在这种情况下,“搜索”表单必须位于“发送”表单之内,并且页面上所有的值都必须保持不变。在这个解决方案中,如果用户在发送表单中输入了内容,然后进行搜索,发送表单的状态将会丢失(除非在FireFox浏览器中)。 - Daniel

1

但是这样你就要依赖 JavaScript 来控制页面行为。如果禁用 JavaScript,页面应该也能正常工作,所以这并不理想。 - Kieran Senior

1

不需要隐藏字段,您可以在按钮的单击事件上设置表单的操作。

JavaScript(使用jQuery)大致如下:

$("#myForm").attr("action", "mvcaction");
$("#myForm").submit();

您可以将其封装在一个标准函数中,该函数接受一个参数,例如操作。我们在菜单表单对象中使用此功能来处理标准菜单项,效果非常好。

编辑:不确定Pocket PC是否完全支持JQuery,但如果不支持,则应该可以在常规JavaScript中执行上述操作。


0

我正在创建的应用程序需要大量使用ajax,但是也遇到了多个表单的问题。

我们使用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产生很大负担)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接