ASP.NET MVC 3 - 在重定向后获取工作流中检测当前页面是否被重定向到

Aar*_*ton 4 c# asp.net asp.net-mvc-3

在我的 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 后,我目前的方法是TempDataDeleteMyEntity方法成功后在我的删除控制器中设置它:

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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

我看到的另一个机会是args在控制器中添加另一个项目并检查它,但在这种情况下,我不妨只使用TempData. 有没有办法在请求上使用 HTTP 响应代码来做到这一点,而无需使用TempData或类似机制传递此数据?

Geo*_*rge 5

另一种方法是设置一个全局动作过滤器,为您“注入”该标志......

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
        }
   }
}
Run Code Online (Sandbox Code Playgroud)

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

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