在我的C#.NET 4 MVC 3应用程序,我有一组CRUD页面,它使用POST重定向获取模式成功后删除重定向到指数控制器删除控制器。 我想呈现指数上的按钮只有当这个页面是不是通过这样的操作重定向到。 有没有一种简单的方法来检测,如果当前页面重定向到(即达到作为PRG重定向的结果)?
看完后http://blog.simonlovely.com/archive/2008/11/26/post-redirect-get-pattern-in-mvc.aspx我目前的做法是设置这在我用delete控制器TempData
后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的更复杂。 你有一个清洁,简单的解决方案,它的工作原理,我说去你所拥有的东西。
另一条途径是建立一个全球性的actionfilter说,“注入”该标志,你...
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(“指数”),然后检查你的接收处理程序
阿里纳斯:我挑战你说大声RedirectDetect而不是傻笑。
我不知道有任何简单的机制,并已使用TempData的相当长的一段时间来实施后重定向消息获取功能。 据我所知,这是特别的原因的TempData的存在之一。 我会继续使用它。
有没有办法告诉请求的重定向3XX或一个简单的用户发起GET的结果之间的差异。 最好的办法是提供仅被重定向初始POST请求追加查询字符串参数,但并没有什么从具有相同的查询字符串重新加载页面停止用户。
嗯,或者你可以发送从POST重定向一个cookie,然后删除该cookie在随后的GET,像这样的回应:
public ActionResult PostHandler(ViewModel model) {
SetCookie("redirected", "true"); // psuedocode
return Redirect("GetHandler2");
}
public ActionResult GetHandler2() {
if( GetCookie("redirected") == "true" ) {
// do something
}
DeleteCookie("redirected");
}
文章来源: ASP.NET MVC 3 - Detect Whether Current Page Was Redirected To in a Post Redirect Get Workflow