1

我正在使用 Yii 框架创建一个非常简单的 1 个文本区域字段和 2 个隐藏输入,其中包含从服务器发送的预定义值。

它应该按预期工作,我的意思是,您在该文本区域上写一些东西,然后单击发送按钮。进行了 ajax 验证(文本区域的唯一必要条件是它不应该为空),如果验证,保存数据并重定向到其他页面。

问题是如果触发验证错误,它不会保存任何数据。

我的意思是,如果我去页面,写一些东西并点击发送按钮,数据将被保存,我将被正确重定向。但是如果我转到页面,点击发送按钮(不在文本区域输入任何内容),等待错误出现(注意这是通过 ajax 完成的,所以这里没有页面重新加载),写点东西然后点击再次发送Yii 将在无限循环中的请求之后开始发出请求。

我已经检查了正在发送的数据,一切都很好(数据和操作 URL)。

这是我的控制器代码

public function actionView($id)
{

    $user = Usuario::model()->findByAttributes(
        array(
            'nick'=>Yii::app()->user->getId()
        )
    );

    $dataProvider=new CActiveDataProvider('Mensaje', array(
        'criteria'=>array(
            'with'=>array('usuario', 'usuario.detallesusuario'),
            'condition'=>'Tema_idtema='.$id
        ),
        'pagination'=>array(
            'pageSize'=>1000,
        ),
    ));

    $this->render('view',array(
        'model'=>$this->loadModel($id),
        'usuario_id'=>$user->idusuario,
        'tema_id'=>$id,
        'dataProvider'=>$dataProvider,
    ));

}

public function actionCreateMessage(){

    $model=new Mensaje;

    $this->performAjaxValidation($model);

    if(isset($_POST['Mensaje']))
    {

        $model->attributes=$_POST['Mensaje'];
        $model->fecha_hora=new CDbExpression('NOW()');

        $model->save();

        $this->redirect(array('view', 'id'=>$model->Tema_idtema));
    }

}

以及来自视图的代码

<?php 

$model = new Mensaje();
echo $this->renderPartial('_mensaje_form', array(
        'model'=>$model,
        'usuario_id'=>$usuario_id,
        'tema_id'=>$tema_id,
    ), 
    false, //return instead of echo
    true //post-process
);

?>

这是“_mensaje_form”代码

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'mensaje-form',
    'action'=>CHtml::normalizeUrl(array('tema/createMessage')),
    'enableAjaxValidation'=>true,
    'clientOptions'=>array(
        'validateOnSubmit'=>true,
        'validateOnChange'=>false,
        'validateOnType'=>false,
    ),
)); ?>

<?php echo $form->errorSummary($model); ?>

<div class="row" style="margin:20px 5px 0 176px;">
    <?php echo $form->labelEx($model,'mensaje'); ?>
    <?php echo $form->textArea($model,'mensaje',array('rows'=>6, 'cols'=>50)); ?>
    <?php echo $form->error($model,'mensaje'); ?>

    <?php echo $form->hiddenField($model, 'Tema_idtema', array('value'=>$tema_id)); ?>      
    <?php echo $form->hiddenField($model, 'Usuario_idusuario', array('value'=>$usuario_id)); ?>
</div>
<div class="row buttons" style="margin:-3px 0 -8px 176px;">
    <?php echo CHtml::submitButton($model->isNewRecord ? 'Responder' : 'Guardar'); ?>
</div>

<?php $this->endWidget(); ?>

知道为什么我会得到那个循环吗?

4

2 回答 2

1

我的猜测(有点远)你的表格 idpreformAjaxValidation()可能是错误的,所以它会导致循环!因为它不会进入身体if并因此执行Yii::app()->end();

在您的控制器中检查它:

protected function performAjaxValidation($model)
{
    if(isset($_POST['ajax']) && $_POST['ajax']==='exact-form-id')//should be mensaje-form
    {
        echo CActiveForm::validate($model);
        Yii::app()->end();
    }
}
于 2012-09-27T09:39:17.863 回答
1

这可能对你有帮助,

http://www.yiiframework.com/forum/index.php/topic/10427-ajax-clientscript/

在您看来,renderPartial 中的最后一个参数“true”可能是问题所在。

于 2012-09-27T11:45:49.777 回答