2013-08-23 67 views
8

我有ActionFilterAttriute沒有正確重定向的問題。我對完整的代碼庫並不熟悉,但我已經看到了足夠的理解,不知道發生了什麼。ActionFilterAttribute不重定向

要simplyfy的代碼,我已經刪除了不相關的部分:

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 
} 

這通常工作,但是當應用程序被用在短時間內幾個請求命中,指數方法最終被因爲View缺少一些數據(我們知道它缺少數據,所以我們想要重定向)。

但是現在當我添加_filterContext.Result = new RedirectResult(ApplicationRedirectResult)作爲OnActionExecuting方法的最後一行時,它怎麼可能仍然調用我的Action方法?

是否有任何知道的錯誤/角落案例/其他任何可能導致MVC無視RedirectResult我已放入filterContext並觸發操作方法?

任何特殊的,可以在OnActionExecuting的邏輯裏面,即使我將filterContext.Result設置爲最後一行,也可能導致問題。屬性內的任何異常都應該放棄它,而不要跳過屬性並調用Action方法。

任何幫助指向我在正確的方向將在這裏讚賞。

+0

如果您查看MVC的源代碼,您將看到一個InvokeActionMethodFilter方法,它在您的篩選器上執行OnActionExecuting並傳遞ActionExecutingContext。如果它返回一個非null的Result值,它會返回一個ActionExecutedContext跳過調用你的動作。所以,從某種意義上說,你所看到的應該是不可能的。所以,唯一的問題可能是Result的空值。如果你評論你的所有邏輯並只保留最後一行,那麼你的重定向工作呢? –

回答

0

我終於找到了問題。它與使用_filterContext類變量有關。

問題是MVC 不是爲每個請求創建一個新的過濾器實例,導致多個請求共享同一個屬性實例。

有關更多詳細信息,請參閱突破更改列表in the MVC3 release notes

0

對Wouter的結果+1。根據你所顯示的代碼,不應該可能實現你描述的結果。也許// magic logic here返回null _filterContext.Result