【问题标题】:Preventing Multiple Submits in MVC在 MVC 中防止多次提交
【发布时间】:2011-08-29 07:39:07
【问题描述】:

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

如果您的视图包含多个提交按钮,则此选项效果不佳。举个例子。

//查看:

@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 中的这个问题。有人知道如何将禁用控件的值传递给服务器吗?

【问题讨论】:

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

标签: javascript asp.net-mvc postback disabled-control


【解决方案1】:

一些背景信息:

如果您想禁用所有按钮,使它们不再可点击,但仍想知道用户点击了什么,我能想到的唯一解决方案是隐藏字段以及此代码:

$(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);
    });
});

不幸的是,没有解决方案(我知道)将处理程序绑定到表单的提交并确定单击了哪个输入。这不是与您的问题相关的问题,但会使上面的代码稍微复杂一些。

【讨论】:

  • 我最终得出了同样的结论。似乎有办法允许将禁用的控件提交回服务器(submitdisabledcontrols="true"),但我永远无法让它工作。我最终只是做了服务器端更改来处理多个按钮点击。
【解决方案2】:

你可以试试这个

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

【讨论】:

  • 那根本行不通。 Request.ServerVariables(我假设您正在谈论)不包含该字段的键。它不会被传递回服务器,因为它已被禁用。通过将 submitdisabledcontrols="true" 属性放在表单上,​​可以通过 ASP.net 中的 webforms 解决此问题。 MVC3 显然不同。
  • 我说的是 FormCollection Coll 变量,它可以在调用动作时作为动作中的参数传递,该集合具有所有提交按钮的所有键名,在上面的示例中是“清除”按钮提交
猜你喜欢
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多