题
我一次又一次遇到的问题是,在用户执行某些操作(例如单击“返回到...”链接或保存他们正在编辑的记录)后,处理重定向到上一页的问题。
以前,每当我需要知道要返回哪个页面时,我都会向当前视图提供一个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
尽管我仍然认为您不应该创建自己的“后退”按钮。
目前,一种快速而肮脏的方法使我望而却步...所以我正在使用一种实用的方法。
从概念上讲,页面的“可支持性”应由您当前所在的页面确定。如果通过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)模式适用于您。
如果您不熟悉它,那么这可能是一个阅读的好地方。
- 使用
Url.Encode(returnUrl)
编码returnUrl以包含在URL中。 - 准备重定向时,请使用
Url.Decode(returnUrl)
,并使用实际重定向的值。