Ajax表单被多次提交

时间:2019-02-11 14:26:34

标签: ajax forms yii2

我的控制器中有一个要提交新模型的动作。 表单位于模式弹出窗口中,我需要完整的Ajax验证。 除表单连续提交多次外,其他所有方法均有效。 如果我删除yiiActiveForm('validate')命令,它可以工作,但是在提交之前我需要它进行验证。

$('#myformid').off('submit').on('submit', function(e){
    e.preventDefault();
    e.stopImmediatePropagation();


    var form = $(this);
    var formData = form.serializeArray();
    form.data('yiiActiveForm').submitting = true;
    form.yiiActiveForm('validate');

    $.ajax({
        url: form.attr("action"),
        type: form.attr("method"),
        data: formData,
        success: function (data) {

            if(data !== false){
                $('#modal-add-associate').modal('hide');
            }
        },
        error: function () {

        }
    });
    return false;

});

表格以

开头
$form = ActiveForm::begin(['enableAjaxValidation' => true,'validationUrl'=> $validationUrl]); 

因此通常由ajax使用自定义网址进行验证(并且除了提交外,它都可以工作)。 表单提交后如何启动验证?

1 个答案:

答案 0 :(得分:2)

您应该首先使用beforeSubmit事件而不是submit,因为您正在使用activeform,而Yii2 ActiveForm为您提供以下表单事件

可用事件是:

详细了解ActiveForms

查看您的JavaScript以及您不需要这些行的问题

form.data('yiiActiveForm').submitting = true;
form.yiiActiveForm('validate');

因为如果您使用submit类型的按钮提交表单,则validateOnSubmit的默认情况下true的选项ActiveForm是自动触发的,因此您会自动触发验证应该删除它们。

确保活动表单具有submit类型的按钮,该表单应如下图所示

$form = ActiveForm::begin(['enableAjaxValidation' => true,'validationUrl'=> $validationUrl]);

//Your fields
//.....
//.....
echo Html::submitButton('Submit', ['class' => 'btn']); 
ActiveForm::end();

您需要修改JavaScript,不需要使用.off().on(),因为beforeSubmit仅在表单通过验证并通过验证后才被调用,并且您正在使用{{1} type调用中的}选项,它是ajax的别名。如果您使用的是method之前的jQuery版本,则应使用type。我想这不是你的情况。如果您使用的是最新的Yii版本1.9.0,则默认情况下它会通过2.0.16包含Jquery 3.3.1,因此您可以将其更改为yii\web\JqueryAsset

method