在Yii中启用客户端验证和提交表单后增加了双记录


Double Records Added After Enabling Client Side Validation And Submitting form in Yii

我在Yii中有一个由AJAX提交的简单表单:

<?php $form = $this->beginWidget('CActiveForm', array(
        'id' => 'application-form',
        'enableAjaxValidation' => true,
        'enableClientValidation' => true,
        'htmlOptions' => array(
            'enctype' => 'multipart/form-data',
            'onsubmit'=>"return send();"
        ),
        'clientOptions'=>array('validateOnSubmit'=>true)
)); ?>
<div class="row">
        <?php echo $form->labelEx($model, 'name'); ?>
        <?php echo $form->textField($model, 'name', array('size' => 60,'maxlength' => 255)); ?>
        <?php echo $form->error($model, 'name'); ?>
    </div>
<div class="row buttons">
        <?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?>
    </div>

和提交功能:

function send (){
var data_form=$("#application-form").serialize();
$.ajax({
    type: "POST",
    url: "<?php echo Yii::app()->createUrl('admin/application/create') ?>",
    dataType:'json',
    data: data_form,
    success: function (data, textStatus, jqXHR) {
        console.log(data);
        alert("success",textStatus);
    },
    error: function (jqXHR, textStatus, errorThrown) {
       // console.log( errorThrown);
    }
});
return false;
}

My create controller:

public function actionCreate()
    {
        $model = new Application;
        $model->setScenario('create');
       $this->performAjaxValidation($model);
        if (isset($_POST['Application'])) {
           if ( $model->save()){
                echo CJSON::encode(array('success' => 'true','id'=>$model->id));
                Yii::app()->end();
            }
        }
        $this->render('create', array(
            'model' => $model
        ));
    }

字段名是必需的,这只是目前的验证。当我尝试在没有输入字段名的情况下提交表单时,验证消息会像在Yii中应该做的那样出现。但是当我正确填写表单时,我的模型在数据库中输入两次。如果我删除以下属性:

'clientOptions'=>array('validateOnSubmit'=>true)

模型被正确保存(只有一次),但是没有出现验证消息。

我怎么能得到默认的验证消息在Yii出现,当我提交我的表单通过ajax和模型不被保存两次。我需要以这种方式提交表单,因为我将在Ajax响应中返回模型id,以便在JavaScript中进行处理。

我在网上搜索了这个问题,并尝试了所有的建议,但没有一个有效。

谢谢大家!

我通过增加'afterValidate'=>'js:function(form,data,hasError){ send(form,data,hasError);和删除'onsubmit'=>"return send();"线来解决。现在它显示验证错误,并且只保存模型一次。