我的控制器中有一个要提交新模型的动作。 表单位于模式弹出窗口中,我需要完整的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使用自定义网址进行验证(并且除了提交外,它都可以工作)。 表单提交后如何启动验证?
答案 0 :(得分:2)
您应该首先使用beforeSubmit
事件而不是submit
,因为您正在使用activeform,而Yii2 ActiveForm
为您提供以下表单事件
可用事件是:
beforeValidate
。afterValidate
。beforeValidateAttribute
。afterValidateAttribute
。beforeSubmit
。ajaxBeforeSend
。ajaxComplete
。详细了解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