MVC表单上的两个或多个操作按钮 - 最佳实践

时间:2009-10-19 14:57:33

标签: jquery asp.net-mvc

我有一个带有表单的ASP.NET MVC应用程序。假设这个表单有任意数量的按钮,每个按钮都有自己的动作。

<input type="button" id="action1" value="One" />
<input type="button" id="action2" value="Two" />
... and so forth

我们希望用户点击一个并点击jQuery动作以提交表单,然后重新发布表单并提供新信息。

有几种方法可以实现这一点。 如何设计优雅的最佳做法是什么?如果可以,请提供代码段。

2 个答案:

答案 0 :(得分:3)

很少提到的方法是使用ActionMethodSelectorAttribute:

http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form.aspx

简而言之,它的工作方式与AcceptVerbs属性非常相似 - 只是通过提交值而不是HTTP方法选择方法。它还可以用于许多其他事情,例如,为AJAX / HTTP请求等选择不同的操作,请求的格式(JSON / XML /等)等。

使用哪种方法 - 切换,属性等 - 取决于具体情况。我不会说这里有最好的做法。

仅举出我所知道的方法:

  1. switch(/ action parameter / submit){} - 太过prodecure,虽然可以使用这样的反射.GetType()。GetMethod(submit).Invoke(this,new object [] { actiondata})。
  2. javascript:输入onclick =“$(this).parents(”form“)。attr(”action“,”specific url“)。submit() - 没有javascript就无法工作
  3. ActionMethodSelectorAttribute - 太陈述。
  4. 我很高兴看到一个更好的方法,例如,[SubmitName(“submit1”)]属性on action,OnActionExecuting()检查它并覆盖被调用的动作......但我不知道它是怎么回事可能的。

答案 1 :(得分:2)

设置潜在行动的对象文字:

var actions = {
  action1: function(elem) {
    // If you just want to submit the form normally
    $(elem).closest('form').submit();
    ...
  },
  action2: function(elem) {
    // If you wanted to ajax load a url-field into a div
    var url = $('#url_field').val();
    $('.display').load(url);
    ...
  }
}

然后编写一个选择器来抓取所有按钮(根据您的需要特定)并将基于元素id的每个函数附加到click处理程序。使用事件委托('$ .live()')可以在有多个按钮或动态添加按钮时提高案例的性能。

$('input[type=button]').live('click', function(e){
  actions[$(this).attr('id')](this);
});

这会在每次点击时调用'actions'变量中的相关操作(你应该验证该函数是否存在)。

然后在每个动作功能中,您可以提交到不同的网址,或者提交ajax,或者加载新信息,或者做任何你想做的事情。就“重新发布表单”而言,这将是一个服务器端函数,它为每个输入元素预先填充其先前的值,就像您在无效提交时所做的那样。

这为您提供了一行代码来处理事件,然后是一个干净的结构来构建您的每个操作。