Yii ajaxSubmitButton()带有字段validation

我正在使用Yii ajaxSubmitButton()来提交表单。 此外,我已将’enableAjaxValidation’参数设置为true以validation相应的文本框。

我能做什么:

  1. 在焦点离开时,以异步方式validation字段。
  2. 单击按钮时,异步调用服务器端方法。

问题是我不知道如何在单击提交按钮时执行字段validation,如果validation了模型,则在客户端执行部分渲染。

如果我覆盖ajaxSubmitButton中的’success’事件,我会得到部分渲染,但我无法维护模型validation。

有帮助吗?


编辑

谢谢回复,

validateOnSubmit标志已设置,如果未设置“success”事件,则会正确validation模型。

当ajaxSubmitButton是这样的:

'js:function(){ alert(\'error\'); }', 'beforeSend'=>'js:function(){ alert(\'beforeSend\'); }', 'success'=>'js:function(data){ alert(\'success, data from server: \'+data); }', 'complete'=>'js:function(){ alert(\'complete\'); }', //'update'=>'#where_to_put_the_response', ) ); ?> 

alert(’success’)将打印对应于模型validation的字符串。 一旦我有了这个字符串,必须在客户端调用什么逻辑?

覆盖“成功”javascript处理程序的原因是从服务器接收部分呈现,与模型validation不同。 我想要两件事:validation和部分渲染。

嘿,我有同样的问题,dint得到它的工作,即使有aftervalidate,beforevalidate等等。其次我想使用这个coz的扩展我的应用程序已经有很多。 所以我这样做了:

编辑:根据Barth的建议,我将这些代码放在这里。

第1步:@你的控制器动作

 public function actionMyAction() { $model=new User; $this->performAjaxValidation($model); if(isset($_POST['User'])) { $model->attributes=$_POST['User']; $valid=$model->validate(); if($valid){ //do anything here echo CJSON::encode(array( 'status'=>'success' )); Yii::app()->end(); } else{ $error = CActiveForm::validate($model); if($error!='[]') echo $error; Yii::app()->end(); } } } 

第2步:@您的观点您的表单可能如下所示

 beginWidget('CActiveForm', array( 'id'=>'user-form', 'enableAjaxValidation'=>true, 'action'=>$this->createUrl('myController/MyAction'), 'enableClientValidation'=>true, )); ?> 
labelEx($model,'attribute1'); ?> passwordField($model,'attribute1',array('size'=>60,'maxlength'=>500)); ?> error($model,'attribute1'); ?>
labelEx($model,'attribute2'); ?> passwordField($model,'attribute2',array('size'=>60,'maxlength'=>500)); ?> error($model,'attribute2'); ?>
true)), array( 'dataType'=>'json', 'type'=>'post', 'success'=>'function(data) { $("#AjaxLoader").hide(); if(data.status=="success"){ $("#formResult").html("form submitted successfully."); $("#user-form")[0].reset(); } else{ $.each(data, function(key, val) { $("#user-form #"+key+"_em_").text(val); $("#user-form #"+key+"_em_").show(); }); } }', 'beforeSend'=>'function(){ $("#AjaxLoader").show(); }' ),array('id'=>'mybtn','class'=>'class1 class2')); ?>

这对我来说很好用。上面写的所有代码都是我的写作风格。 您可以根据需要更改它们,但是,只有两件事需要注意如下:1。@您的控制器调用模型的validation并返回一个json对象,如果表单无效2. @您的视图中断此json对象(或遍历通过它)并在表单的相应元素下显示错误消息。

把事情简单化 :)

你也可以在这里看到我的博客文章: http : //www.yiiframework.com/forum/index.php/topic/37075-form-validation-with-ajaxsubmitbutton/

CActiveForm有一个名为$clientOptions的公共属性。 有一个validateOnSubmit选项,默认情况下为false。 你需要它是真的。 在您的视图中,它应该看起来像这样:

 beginWidget('CActiveForm', array( 'id'=>'yourFormId', 'enableAjaxValidation'=>TRUE, 'clientOptions'=>array('validateOnSubmit'=>TRUE), )); ?> 

http://www.yiiframework.com/doc/api/1.1/CActiveForm#clientOptions-detail

我找到了解决方案。 我的CActive表格

 beginWidget('CActiveForm', array( 'id'=>'gold-value-form', 'enableAjaxValidation'=>true, 'clientOptions'=>array( 'validateOnSubmit'=>true, 'afterValidate'=>'js:function(form, data, hasError) { if(jQuery.isEmptyObject(data)) { alert("ok") } return false; }' ), )); ?> 

我创建动作

 public function actionCreate() { $this->layout=false; $model=new GoldValue; if(isset($_POST['ajax']) && $_POST['ajax']==='gold-value-form') { if(isset($_POST['GoldValue'])) { $model->attributes=$_POST['GoldValue']; if(!$model->save()) echo CActiveForm::validate($model); } } Yii::app()->end(); } 

我打算尝试在ajaxSubmitButton点击上发送一个不同的值(用$ _GET发布)。 测试值,然后在值不存在时运行validation。 这对你有用吗?

检查这个片段,它解决了客户端的问题http://www.yiiframework.com/wiki/466/a-simple-way-to-get-yii-client-side-form-validation-run-when-submitting逐AJAX /

试试这个:

 /* 1) Register the snippet into the HEAD. Be sure that it is linked after jquery.yii.js is linked. 2) Configure your CActiveForm instance like this: */ $this->beginWidget('CActiveForm', array( ... 'enableClientValidation'=>true, 'clientOptions'=>array( 'validateOnSubmit'=>true, 'afterValidate'=>'js:$.yii.fix.ajaxSubmit.afterValidate' ) ... ); /* 3) Configure your CHtml::ajaxSubmitButton instance like this: */ echo CHtml::ajaxSubmitButton('Whateverlabel', 'whateverurl', array( ... 'beforeSend'=>'js:$.yii.fix.ajaxSubmit.beforeSend("#YOUR_FORM_ID")' ... ); 

查看更多http://www.codexamples.com/90/chtml-ajaxsubmitbutton/或http://www.codexamples.com/category/chtml-8/