禁用按钮后,其值未发布到控制器

时间:2011-08-17 10:17:28

标签: asp.net-mvc-3 post

我有一个像那样检查的控制器

if (form["submit"].ToString() == "Continue")
{

}

我有按钮正在提交

<button name="submit" value="Continue">Continue</button>

在我决定在提交时禁用“继续”按钮以防止使用此功能双击时,一切正常:

$('form').submit(function () {
                if ($(this).valid()) {
                    $(':submit', this).attr('disabled', 'disabled');
                }
            });

所以现在我没有在控制器上发布值form["submit"]

我有什么想法可以解决这个问题吗?

我仍希望阻止第二次点击,但能够在控制器上发布form["submit"]值。

1 个答案:

答案 0 :(得分:1)

您可以控制表单中隐藏字段中的submit值吗?我无法分辨您可能需要的其他逻辑,但是当表单呈现时,您可以将隐藏字段的值设置为提交按钮的值,并在必要时使用下面的第一个脚本进行更改。只要它具有name属性并且已启用(您很少禁用隐藏字段),它就会在提交表单时发布。

$(function() {
    // this assumes your button has id="myButton" attribute
    $(':hidden[name="submit"]').val($('#myButton').val());
});

当然,在您的表单中,您需要一个名为=“submit”的隐藏字段

<input type="hidden" name="submit" value="Continue" />

然后,每当表单状态发生变化时,修改按钮的禁用状态隐藏字段的值以反映该值(如果它发生了更改)。

您可能会发现对此类UI功能有用的框架。我想起了KnockoutJS。它可以用来“赋值”绑定输入元素。对于这个小例子来说,这可能有点过头了,但如果您的UI扩展可能会有用。如果您有兴趣,我在下面添加了标记,脚本和评论。

$(function () {
    var viewModel = {
        submitValue: ko.observable("Continue")
    };

    ko.applyBindings(viewModel);

    $('form').submit(function() {
        if($(this).valid()) {
            // the following line will change the both the hidden field's value
            // as well as the button's value attribute
            viewModel.submitValue("some other value");

            // I couldn't follow your selector here, but please note I changed 
            // the name of the submit button in the markup below.
            $(':submit, this).attr('disabled', 'disabled');
        }
    });
});

KnockoutJS要求您使用data-bind属性来设置元素。在您的情况下,您将一个属性绑定到多个元素,如下所示:

<button name="submitButton" data-bind="value: submitValue"/>Continue</button>
<!-- and bind the same value similarly in the hidden field-->
<input type="hidden" name="submit" data-bind="value: submitValue"/>