2010-10-29 110 views
3

我目前有2個過濾器,Auth和Redirect,它們執行以下操作:Filter Auth(實現IAuthorizationFilter和ActionFilter)檢查用戶登錄和授權,如果失敗,則將filterContext.Result設置爲403(禁止)的HttpStatusCodeResult 。過濾器重定向(實現IActionFilter和ActionFilter)檢查結果,如果它是403,則重定向到登錄頁面。ASP.NET MVC操作篩選器:在篩選器中設置filterContext.Result可防止執行其他篩選器?

我有他們施加到動作如下:

[Auth(Order=0)] 
[Redirect(Order=1)] 

然而,驗證被執行但重定向從未被執行(未它提供的4種覆寫投放方法之一)。如果我刪除認證重定向獲取執行,但如果我包含認證作爲第一個過濾器,重定向不會執行。我想設置過濾器上下文的Result屬性會阻止任何其他過濾器被執行,但我不能實現這種情況。僅供參考我正在使用ASP.NET MVC 3測試版,但這不應該改變任何東西。

更新:將Auth的過濾器類型更改爲IActionFilter而不是IAuthorizationFilter會導致重定向中的OnResultExecuting和OnResultExecuted觸發,但更改Response對瀏覽器的最終響應沒有任何影響。

回答

2

我最終通過使重定向IResultFilter,寫在OnResultExecuting以下固定它:

filterContext.HttpContext.Response.Redirect(url); 
0

當您設置HttpStatusCodeResult您正在設置重定向,所以第二個過濾器將不會執行(因爲您已經重定向)。

+0

的HttpStatusCodeResult沒有最終會被重定向,它只是告訴ASP.NET MVC服務了一個響應指定的狀態碼。 – Diego 2010-10-29 23:51:12