ASP.NET MVC 3 – 检测当前页面是否重定向到后重定向获取工作流程

在我的C#.NET 4 MVC 3应用程序中,我有一组用于一组CRUD页面的删除控制器,它使用Post Redirect Get模式在成功删除后重定向到Index控制器。 我想在索引页面上呈现一个按钮,只有当这个页面没有被这样的动作重定向时。 有没有一种简单的方法可以检测当前页面是否被重定向到(即由于PRG重定向而到达)?

阅读http://blog.simonlovely.com/archive/2008/11/26/post-redirect-get-pattern-in-mvc.aspx后,我目前的方法是在DeleteMyEntity方法之后使用DeleteMyEntity在我的删除控制器中设置它成功了:

 try { MyService.DeleteMyEntity(MyViewModel.MyEntity); TempData["Redirected"] = true; args = new RouteValueDictionary(new { Foo = 1, Baa = 2 }); return RedirectToAction("Index", args); } catch (Exception e) { //Logging etc. - redirect should never be reached on exception (and TempData item not set) throw(e); } 

然后在我的索引控制器中,我检查该值是否存在且为真:

 if (TempData["Redirected"] != null) { //we can then do something useful with this } 

我看到的另一个机会是在args添加另一个项目并在控制器中检查这个,但在这种情况下我也可以使用TempData 。 有没有办法在请求中使用HTTP响应代码执行此操作,而无需通过TempData或类似机制传递此数据?

我以类似的方式使用TempData – 例如,在添加/更新/删除记录时显示我的视图的状态消息(重定向到之后)。 这是TempData用于的简单,丢弃的东西,所以我说你的东西是合适的。

我个人不会弄乱HTTP状态代码,除非我绝对需要它。 你可能会对引用者http头做一些事情,但同样,这比使用TempData更麻烦,更复杂。 你有一个干净,简单的解决方案,我会说你有你的东西。

另一条路线是设置一个全局动作filter,为你“注入”那个标志……

 public class RedirectDetect: ActionFilterAttribute{ public override void OnActionExecuted(ActionExecutedContext filterContext){ if (filterContext.Result is RedirectToRouteResult || filterContext.Result is RedirectResult) { TempData["Redirected"] = true; //or what ever other indicator you want to set } } } 

然后你可以调用redirectToAction(“Index”),然后检查你的接收处理程序

旁注:我挑战你说RedirectDetect大声而不是假笑。

我不知道任何更简单的机制,并且已经使用TempData很长一段时间来实现Post-Redirect-Getfunction。 据我所知,这是TempData存在的原因之一。 我会继续使用它。

由于3xx重定向或直接的用户启动的GET,无法区分请求之间的区别。 最好的方法是提供一个querystring参数,该参数只附加了初始POST请求的重定向,但是没有什么能阻止用户使用相同的查询字符串重新加载页面。

嗯,或者您可以从POST发送带有重定向的cookie,然后在后续GET的响应中删除cookie,如下所示:

 public ActionResult PostHandler(ViewModel model) { SetCookie("redirected", "true"); // psuedocode return Redirect("GetHandler2"); } public ActionResult GetHandler2() { if( GetCookie("redirected") == "true" ) { // do something } DeleteCookie("redirected"); }