我一次又一次遇到的问题是,在用户执行某些操作(例如单击“返回到...”链接或保存他们正在编辑的记录)后,处理重定向到上一页的问题。

以前,每当我需要知道要返回哪个页面时,我都会向当前视图提供一个returnURL参数。 通用标签

这不是处理这种情况的一种非常干净的方法,因为有时返回URL包含诸如搜索字符串之类的参数,这些参数必须包含在URL中。 通用标签

此外,当用户在返回带有returnURL的页面之前可以向前移动另一页时,这会引起问题,因为您必须将returnURL传递给所有访问过的页面。

仅调用浏览器的“后退”功能还是不够的,因为您可能希望刷新页面,例如显示刚刚保存在上一页中的修改。

所以我的问题是,有没有人找到一种聪明的方式来处理这种情况,特别是在MVC环境中?

注意:我使用的是ASP .NET MVC,因此,如果可能,我希望获得与此相关的答案,但是欢迎提出任何想法。

有帮助吗?

解决方案

设置Cookie或使用会话变量有什么问题?唯一不会的原因是,如果您不控制调用您的页面,在这种情况下,您唯一的选择是查询字符串,发布值或引荐来源网址。

其他提示

我想我可以在问题中添加答案,看看其他人是否认为这是个好主意。

我只是使用TempViewData将其传递给控制器: 通用标签

,然后以类似的方式访问它(在我的真实版本中,我检查密钥是否在TempData中,并且returnURL是真实URL): 通用标签

如果需要在第一页更改之后继续操作(例如,搜索页->编辑页->编辑栏目页),请再次添加 通用标签

在其上查看我的博客文章:使用cookie,以控制在asp.net mvc 3上登录后的返回页面

就像提到的@Mystere Man一样,您可以仅使用Cookie或会话。不久前我遇到类似情况时,我就去吃饼干。

尝试注册一个新的路由,其网址为/{controller}/{action}/{id}/returnurl/{*url},然后在接受 url 作为参数的操作中使用RedirectToAction

通用标签

尽管我仍然认为您不应该创建自己的“后退”按钮。

使用拦截器或方面:

  1. 以某种方式(例如,@Before方面)拦截每个请求,并将请求的URL保存到会话中,每次都将其覆盖
  2. 在您的视图层中,根据需要访问该Session对象(如果您使用的是反向链接)。

    这种设计使您始终可以使用最新的请求。这里是示例在.NET中编写方面/拦截器。另外, PostSharp 是.NET方面的项目。

目前,一种快速而肮脏的方法使我望而却步...所以我正在使用一种实用的方法。

从概念上讲,页面的“可支持性”应由您当前所在的页面确定。如果通过ViewModel将在Controller中捕获的参数传递给View,则View可以推断出这种情况(在大多数情况下)。

示例:

访问过Foo后,我将使用Bar查看一些内容,并且后退按钮应返回到Foo

控制器 通用标签

ViewModels 通用标签

查看(部分) // No pun intended... or maybe it was. :)

您的BarView现在可以从其模型中解译出需要返回的位置(使用fooId)。

在BarView上(使用MVC2语法): 通用标签

您也可以使用Html.ActionLink。

或者:

您可以从BaseViewModel继承ViewModel,后者可以具有受保护的属性returnURL。在必要时进行设置。

示例:

在您的ViewModel上: 通用标签

查看时: 通用标签

通过部分动作而不显示页面而不使用JQuery来创建对话框/向导工作流,可以更好地解决此问题?

然后,您只需要对对话框上的“完成”按钮做出反应即可刷新原始视图。

对于您有关“保存他们正在编辑的记录”的部分问题,我认为重定向获取(PGR)模式适用于您。

如果您不熟悉它,那么这可能是一个阅读的好地方。

  1. 使用Url.Encode(returnUrl)编码returnUrl以包含在URL中。
  2. 准备重定向时,请使用Url.Decode(returnUrl),并使用实际重定向的值。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top