2011-08-29 148 views
3

this question禁用提交按钮以防止多次回发是停止(非恶意)用户多次回发的可行解决方案。在MVC中防止多次提交

如果您有多个提交按钮的视图,则此选项无法正常工作。以下面的例子。

//查看:

@using (Html.BeginForm("Catalog", "Images", FormMethod.Post, new { onsubmit = "Utility.disable_buttons(this.id);", id = "catalog_form" })) 
{ 
<p> 
    <input type="submit" name="btnSubmit" value="Clear" /> | 
    <input type="submit" name="btnSubmit" value="Catalog" /> | 
    <input type="submit" name="btnSubmit" value="Update" /> | 
    @Html.ActionLink("Back to List", "Index") 
</p> 
} 

//控制器:

[HttpPost] 
    public ActionResult Catalog(string btnSubmit) 
    { 
     switch (btnSubmit) 
     { 
      case "Catalog": 
       //More differenter code 
       break; 
      case "Clear": 
       //Different code 
       break; 
      case "Nothing": 
       //Code 
       break; 
     } 
     return View(); 
    } 

在视图中,有三种不同的提交动作。如果这些按钮被禁用,那么它们的值将不会被传递,并且控制器将不知道哪个按钮触发了提交。 (控制器始终为空。)不幸的是,submitdisabledcontrols属性似乎不能解决MVC中的这个问题。有人知道如何将禁用控件的值传递给服务器吗?

+0

我可能不得不为这个看似简单的问题开始赏金...... – Coda

回答

2

一些背景资料:

如果你想禁用所有的按钮,使他们不再是可点击的,但仍然想知道用户点击我能想到的唯一的解决办法是隐藏字段一起使用此代码:

$(function() { 
    $('input[type=submit]').click(function() { 
     var form = $(this).closest('form'); 
     form.find('#hiddenField').val($(this).val()); 
     form.find('input[type=submit]').prop('disabled', true); 
    }); 
}); 

如果你只是要确保用户不能点击其他按钮点击后,一个你可以这样做:

$(function() { 
    $('input[type=submit]').click(function(event) { 
     $(this).closest('form').find('input[type=submit]').not(this).prop('disabled', true); 
    }); 
}); 

不幸的是没有解决办法(我知道)绑定一个处理器到form's提交并确定输入被点击。这不是与你的问题有关的问题,但使上述代码稍微复杂一些。

+0

I最终得出同样的结论。看起来有许多方法可以将禁用控件提交回服务器(submitdisabledcontrols =“true”),但我永远无法使其运行。我最终只做了服务器端更改以处理多个按钮点击。 – Coda

0

你可以试试这个

if (coll.AllKeys.Contains("Clear")) 
{ 
    // your code here for this submit 
} 
+0

这根本不起作用。 Request.ServerVariables(我假设你在谈论)不包含该字段的键。它不会传回服务器,因为它被禁用。这可以通过在表单上放置submitdisabledcontrols =“true”属性来解决ASP.net中的webforms。 MVC3显然不同。 – Coda

+0

我正在谈论FormCollectionCollection变量,它可以作为参数传递,而一个动作被调用时,这个集合拥有所有提交按钮的所有键名,在上面的例子中它是“清除”按钮提交 –