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