我发现今天发现的yii2 ajax验证非常奇怪。
基本上我试图在表单的1个字段上执行ajax验证,以检查输入是否唯一,并且在该表的该字段中的任何位置都找不到。
如果您问我以下代码应该正常工作:
模特:
public function scenarios(){
return ['update' => ['username']];
}
public function rules(){
return [['username'], 'unique'];
}
在控制器中:
public function actionUpdate(){
$user = User::findmodel.. bla bla
some more bla bla..
if(Yii::$app->request->isAjax){
$user->setScenario('update');
$user_post_ajax = Yii::$app->request->post('User');
$user->username = $user_post_ajax['username'];
Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
return ActiveForm::validate($user);
}
some more bla bla bla..
}
在视图中:
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($user, 'username', ['enableAjaxValidation' => true])->textInput() ?>
<?= Html::submitButton('Save', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
<?php ActiveForm::end(); ?>
这应该可行,但它没有,它不会显示验证错误,在这种情况下类似于:'Username is already taken'
,它既不显示有效也不显示无效。它执行ajax请求,我可以在开发工具中看到json响应但它根本不显示。但是,当您将$user->setScenario('update');
移到if条件之外时,仅在if(Yii::$app->request->isAjax)
之上,那么它的效果非常好。我不明白这一点,我错过了什么?为什么在ajax请求改变行为时使用setScenario?
答案 0 :(得分:0)
您正在覆盖Yii模型中的scenario()函数,因此不会验证任何属性。
检查:https://github.com/yiisoft/yii2/blob/master/framework/base/Model.php#L184
你应该做的是:
<Grid>
<Grid.Background>
<LinearGradientBrush>
<GradientStop />
<GradientStop />
</LinearGradientBrush>
</Grid.Background>
<Grid.Triggers>
<EventTrigger RoutedEvent="Grid.Loaded">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard TargetProperty="Background.GradientStops[0].Color">
<ColorAnimation From="Red"
To="Green"
Duration="0:0:2"
AutoReverse="True"
RepeatBehavior="Forever" />
</Storyboard>
</BeginStoryboard>
<BeginStoryboard>
<Storyboard TargetProperty="Background.GradientStops[1].Offset">
<DoubleAnimation From="0"
To="1"
Duration="0:0:2"
AutoReverse="True"
RepeatBehavior="Forever"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Grid.Triggers>
<TextBlock>Grid...</TextBlock>
</Grid>