如何在更新记录后将用户重定向到上一页?这是典型的场景:
- 用户在索引页中过滤结果或分页记录,然后他们找到他们想要编辑的并单击编辑按钮。他们更新记录的数据,一旦他们点击"更新"按钮,他们将被重定向到索引视图,但过滤器/页面之前选择。
我尝试在更新
后在我的控制器中使用下面return $this->redirect('index',302); (this is not what I need)
return $this->redirect(Yii::$app->request->referrer); (this gets user back to update view and not to index view with filters)
return $this->goBack(); (this gets user to homepage)
谢谢!
在您希望用户被重定向到添加
的操作中'yii'helpers'Url::remember();
现在在任意控制器中调用:
return $this->goBack();
将用户重定向到"已标记"的动作
我建议在典型的更新操作方法中使用以下方法:
public function actionUpdate($id)
{
$model = $this->findModel($id);
if(Yii::$app->request->isGet) {
Url::remember($this->request->referrer, $this->action->uniqueId);
}
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(
Url::previous($this->action->uniqueId) ?: ['view', 'id' => $model->id]
);
}
return $this->render('update', [
'model' => $model,
]);
}
URL只有在它是GET请求(典型的第一次调用)时才会被记住,因为如果验证失败,可以再次调用该操作。然后它是一个POST调用,您不想记住现在是更新操作本身的引用者。
保存成功后,您可以重定向到记住的URL。如果由于某种原因没有记住URL,则将使用标准(或其他)。
我在URL::remember()和URL:: previous()中添加了一个名称。它应该是唯一的,并且只在这个动作中使用。$ This ->action->uniqueId就是这种情况。我认为应该这样做,因为用户可以打开多个选项卡,在应用程序的其他地方导航,你可能有更多的更新动作与相同的机制。如果没有提供唯一的名称,那么将使用最后记住的URL,这个URL可能是不同的、意外的URL。用户会感到困惑。
与Bizley的方法相比,该解决方案在操作本身中是自包含的。无需在其他操作中记住之前的URL。
更新:解决方案仍然存在问题,但它是可接受的。