ActionFilterAttribute不重定向

时间:2013-08-23 12:11:23

标签: .net asp.net-mvc asp.net-mvc-4 actionfilterattribute

我遇到了一个没有正确重定向的ActionFilterAttriute问题。我不熟悉完整的代码库,但我已经看到了不知道发生了什么。

为了简化代码,我删除了不相关的部分:

public class ResolveApplicationRedirectAttribute : ActionFilterAttribute
{
    //some variables
    private ActionExecutingContext _filterContext;

    protected string ApplicationRedirectUrl
    {
        get { return ConfigurationManager.AppSettings["ApplicationRedirectUrl"]; }
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        _filterContext = filterContext;

        //a lot of logic that decide if we should redirect or not

        //I added this after the other logic to make it always redirect regardless of what happens inside the logic above
        _filterContext.Result = new RedirectResult(ApplicationRedirectResult);
    }
}

[ResolveApplicationRedirect]
public ActionResult Index(CrmQueryStringParameters crmParameters){
  //some logic
}

这通常有效,但是当应用程序在短时间内被一些请求命中时,Index方法最终被调用,并且由于View缺少某些数据而被炸毁(我们知道它缺少数据。这就是我们想要重定向的原因。)

但是现在当我添加_filterContext.Result = new RedirectResult(ApplicationRedirectResult)作为OnActionExecuting方法的最后一行时,它怎么可能仍然调用我的Action方法?

是否有任何知道错误/角落案例/其他任何可能导致MVC无视RedirectResult我已放入filterContext并激活行动方法的内容?

即使我将filterContext.Result设置为最后一行,OnActionExecuting逻辑中的任何特殊内容都可能导致问题。属性中的任何异常都应该将其炸毁,而不是跳过属性并调用Action方法。

任何有助于指出我正确方向的帮助都将在这里受到赞赏。

2 个答案:

答案 0 :(得分:0)

+1 Wouter的结果。鉴于您展示的代码,不可能实现您描述的结果。也许// magic logic here返回null _filterContext.Result

答案 1 :(得分:0)

我终于找到了问题。它与使用_filterContext类变量有关。

问题是MVC 没有为每个请求创建一个新的过滤器实例,导致多个请求共享同一个属性实例。

有关详细信息,请参阅重大更改列表in the MVC3 release notes