Validation Yii在多个模型验证和保存后重定向到同一视图

Validation Yii在多个模型验证和保存后重定向到同一视图,validation,redirect,yii,Validation,Redirect,Yii,基于此,我有一个类似的解决方案。例如: public function actionBatchUpdate() { // retrieve items to be updated in a batch mode // assuming each item is of model class 'Item' $items=$this->getItemsToUpdate(); if(isset($_POST['Item'])) { $valid=t

基于此,我有一个类似的解决方案。例如:

public function actionBatchUpdate() {
    // retrieve items to be updated in a batch mode
    // assuming each item is of model class 'Item'
    $items=$this->getItemsToUpdate();
    if(isset($_POST['Item'])) {
        $valid=true;
        foreach($items as $i=>$item) {
            if(isset($_POST['Item'][$i]))
                $item->attributes=$_POST['Item'][$i];
            $valid=$item->validate() && $valid;
        }
        if($valid)  // all items are valid
            // ...do something here
    }
    // displays the view to collect tabular input
    $this->render('batchUpdate',array('items'=>$items));
}
问题是,我不知道过程结束时发生了什么。 如果我没有在此处放置任何重定向:

if ($valid) {
    foreach ($models as $model) {
        $model->save();
    }
}
if ($valid) {
    foreach ($models as $model) {
        $model->save();
    }
    $this->redirect...
}
if ($valid) {
    foreach ($models as $model) {
        $model->save();
    }
}
$this->redirect...
模型保存得很好,我得到的验证错误很好,但表单保持填充状态。这对我不好。 如果我把重定向放在这里:

if ($valid) {
    foreach ($models as $model) {
        $model->save();
    }
}
if ($valid) {
    foreach ($models as $model) {
        $model->save();
    }
    $this->redirect...
}
if ($valid) {
    foreach ($models as $model) {
        $model->save();
    }
}
$this->redirect...
模型保存得很好,但我的唯一规则是这些记录已经存在,因此会出现验证错误。好像有第二次模型保存还是什么

如果我把重定向放在这里:

if ($valid) {
    foreach ($models as $model) {
        $model->save();
    }
}
if ($valid) {
    foreach ($models as $model) {
        $model->save();
    }
    $this->redirect...
}
if ($valid) {
    foreach ($models as $model) {
        $model->save();
    }
}
$this->redirect...
模型的保存和重定向进行得很顺利,但我从未遇到验证错误

我曾尝试玩过令人不安的$u帖子,但我不知道遗漏了什么。我错过了什么


更新:也许这很重要,我想重定向到基本呈现的相同页面。 我不确定我是否需要重定向。 有趣的是,当我在网格中为checkboxcolumn执行此操作时,只返回了唯一的验证错误:

'checked' => '$_POST["rendelesGyartmanyId"][$row]',
我这样做是为了确保当用户检查了很多复选框,并且存在任何验证错误,并且页面被重新加载时,不必重新检查复选框,但这可能不是一个好的解决方案

更新_2:不确定,但问题可能是浏览器保留选定值。。。?我发现了一个类似的问题

问题是,在提交并重定向到同一视图之后,POST仍然被设置,并且值仍然存在。这就是Yii希望再次提交的原因,但由于我定义了唯一的规则,因此会出现验证错误。处理POST数据后,必须将其重定向到其他地方,这是Yii的常见行为吗?是否没有其他方法可以重定向到同一个页面作为一个干净的开始?我试图取消设置模型的属性,并发布,但我无法解决它,但可能我只是没有用好的方式来做

更新3:非常有趣。如果我在此处注释掉模型保存:

if ($valid) {
    foreach ($models as $model) {
        // $model->save();
    }
    $this->redirect...
}
重定向已被识别并正常工作,但一旦我删除注释,重定向将不被识别。我在那里放了一个假视图命令,这样我可以看到Yii没有识别它


有人能告诉我这里发生了什么吗?

您对表单使用了ajax验证吗?如果是,则在控制器上实现ajax验证代码,或者将ajax验证设置为false。下面的代码是正确的:

if ($valid) {
   foreach ($models as $model) {
       $model->save(false); //The model has been validated, no need to validate again
   }
   $this->redirect...
}

非常感谢你的帮助。现在,如果我填充了所有内容,并且没有验证错误,那就好了。但是,如果第一次提交时出现验证错误,并且我想更正缺少的字段值,那么我会再次得到这个唯一的验证错误。也许重要的是,我想重定向到基本呈现的相同页面。这是关键:
$form=$this->beginWidget('GxActiveForm',array('id'=>'…-form','enableAjaxValidation'=>false,);
将表单小部件的enableAjaxValidation属性设置为false。现在它可以工作了。