【问题标题】:Html.BeginForm how to avoid multiple form submission?Html.BeginForm 如何避免多个表单提交?
【发布时间】:2014-09-23 09:18:14
【问题描述】:

我们有以下注册页面代码

@using (Html.BeginForm(MVC.Account.Register(Model.ReturnUrl), FormMethod.Post, new { @id = "register-form" }))
{
    <div class="control-group clear">
        @Html.LabelFor(m => m.Email)
        @Html.TextBoxFor(m => m.Email, new { type = "email", @class = "forbid-lt-gt" })
        <span class="hint raise">Will be user as Username.</span>
        <div class="error">@Html.ValidationMessageFor(m => m.Email)</div>
    </div>
    <div class="control-group clear">
        @Html.LabelFor(m => m.Password)
        @Html.PasswordFor(m => m.Password)
        <span class="hint raise">Length between 6 and 10 characters</span>
        <div class="error">@Html.ValidationMessageFor(m => m.Password)</div>
    </div>
    <div class="control-group clear">
        @Html.LabelFor(m => m.ConfirmPassword)
        @Html.PasswordFor(m => m.ConfirmPassword)
        <div class="error">@Html.ValidationMessageFor(m => m.ConfirmPassword)</div>
    </div>

    <div class="control-group action">
        <button class="btn primary" type="submit">
            <span>Sign up</span>
        </button>
    </div>
    <div class="clear"></div>
}

和文件formBlocker.js 防止多个按钮点击

$(function() {
    $('form').one('submit', function () {
        $(this).find('button[type="submit"]').attr('disabled', 'disabled');
    });

    //Enable submit button if data has changed
    $('form').live("input", function () {
        $(this).find('button[type="submit"]').removeAttr('disabled');
    });
});

通常一切都很好,但有时它不起作用,并且在用户多次单击按钮后,表单可以多次发送到服务器。早期我们遇到的问题是,点击 IE 表单中的提交按钮后,会被发送到服务器两次。现在我们没有这个问题,但它没有得到解决。

【问题讨论】:

  • 感谢您发布尽可能多的信息。但唯一相关的信息是您的 javascript,因为这是一个已知问题,我删除了所有不敬的代码。
  • 好的,但我认为问题可能出在两个 jquery 库中。
  • 我不确定你是如何使用这两个版本的。不管它有多可怕,如果你使用 jQuery > 1.7 你应该停止使用live,如果你使用 jQuery > 1.9 你必须停止使用live

标签: javascript asp.net asp.net-mvc forms asp.net-mvc-validation


【解决方案1】:

live 死了。死的。它在 2.7 中被弃用并在 2.9 中被删除。死了!

我会使用这种方法:

var serializedData;

$(function () {
    $('form').submit(function () {
        var tempSerializedData = $(this).serialize();
        if (tempSerializedData != serializedData) 
            serializedData = tempSerializedData;
        else 
            return false;

    });
});

【讨论】:

  • @max,我不明白你的意思。
【解决方案2】:

试试这个不确定,但这对我有用

$('form').one('submit', function () {
        $(this).find('button[type="submit"]').attr('disabled', 'disabled');
        setTimeout(function () {
              $(this).find('button[type="submit"]').attr('disabled', 'disabled');
         }, 20);
    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 2010-10-05
    • 2011-12-10
    相关资源
    最近更新 更多