【发布时间】:2012-11-27 22:18:25
【问题描述】:
在我的 C# .NET 4 MVC 3 应用程序中,我有一个用于一组 CRUD 页面的删除控制器,它使用 Post Redirect Get 模式在成功删除后重定向到索引控制器。仅当此页面未被此类操作重定向到时,我才想在索引页面上呈现一个按钮。有没有一种简单的方法来检测当前页面是否被重定向到(即作为 PRG 重定向的结果到达)?
阅读http://blog.simonlovely.com/archive/2008/11/26/post-redirect-get-pattern-in-mvc.aspx 后,我当前的方法是在DeleteMyEntity 方法成功后使用TempData 在我的删除控制器中设置它:
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 或类似机制传递此数据?
【问题讨论】:
-
您可以从
HttpContext.Current.Request.Headers中读取referer标头的值,但这取决于客户端浏览器的表现是否良好。TempData基本上是为这类事情设计的,听起来是你最好的选择。 -
sargant 我应该对环境有很好的控制。我看了一下这个,我想不出一个实现,我不需要检查引用者是否在我不想为其呈现按钮的引用者列表中。我认为从我重定向的控制器传递标志更容易。
标签: c# asp.net asp.net-mvc-3