ASP.NET MVC學習筆記-----Filter(1)


Filter類型 接口 MVC的默認實現 Description
Authorization IAuthorizationFilter AuthorizeAttribute 最先執行,在其他類型的filter和action方法前執行
Action IActionFilter ActionFilterAttribute 在action方法執行前和執行后執行
Result IResultFilter ActionFilterAttribute 在result執行前和執行后執行
Exception IExceptionFilter HandleErrorAttribute 在拋出異常時執行,(異常發生在action/result/filter)
 
Authorization Filter
Authorization Filter是所有Filter類型中第一個執行的Filter,它在action方法調用前執行。Authorization Filter需要實現IAuthorizationFilter接口:
public interface IAuthorzationFilter
{
     void OnAuthorization(AuthorizationContext context);
}
可以看出,我們要實現Authorization機制的代碼就需要放在OnAuthorization方法中,而其參數類型AuthorizationContext繼承於ControllerContext,如下所示:
 public class AuthorizationContext : ControllerContext
 {   

     public AuthorizationContext();   

     public AuthorizationContext(ControllerContext controllerContext, ActionDescriptor actionDescriptor);     
     public virtual ActionDescriptor ActionDescriptor { get; set; }
     public ActionResult Result { get; set; }

 }
AuthorzationContext額外提供了Result屬性和ActionDescriptor屬性,result屬性表示授權階段呈現的ActionResult,而ActionDescriptor則包含了當前執行Action的信息。
Asp.net MVC給我們提供了一個IAuthorzationFilter的實現AuthorizeAttribute(沒錯,它是一個Attribute,繼承於FilterAttribute),該Attribute可以應用於Controller和Action, 它包含Roles和Users屬性,指定特定的角色和用戶才可以授權使用。比如:
public class HomeController : Controller
{
     [Authorize(Users = "zhang, zheng", Roles = "admin")]
     public ActionResult Index()
     {
          return View();
     }
}
以上代碼表示只有用戶zhang,zheng並且擁有角色admin的用戶才可以被授權執行Index Action。

 
               
Exception Filter
當一個未處理異常拋出時,Exception Filter將會被執行。Exception Filter需要實現IExceptionFilter接口:
public interface IExceptionFilter
{
     void OnException(ExceptionContext filerContext);
}
ExceptionContext同樣繼承於ControllerContext,它提供了以下額外的屬性:
屬性名 類型 描述
ActionDescriptor ActionDescriptor 提供當前所執行的Action的信息
Result ActionResult Exception Filter所呈現的ActionResult
Exception Exception 未處理的異常
ExceptionHandled bool 表示是否已有其他filter處理過此異常
 
              
ExceptionHandled是一個很重要的屬性。一般來說,當一個Exception Filter執行時,我們首先需要檢查ExceptionHandled屬性,如果為true,則表示已有其他filter處理過此異常了,就不需要再次進行處理了,以免覆蓋其他filter所解決的Exception。如果為false,則對該Exception進行相應的處理,處理之后將ExceptionHandled屬性設置為true。默認的,如果沒有Exception Filter將ExceptionHandled屬性設置為true, ASP.NET MVC將使用默認的異常處理,即顯示我們經常看到的異常頁面。
 
             
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM