ASP.NET MVC的過濾器

何謂過濾器

過濾器又名爲篩選器,可以爲咱們優雅的處理某一類需求提供解決方案,好比用戶登陸、自定義數據上下文初始化、捕獲異常、發佈公告等。從功能性上來說過濾器沒什麼與優點,即過濾器可實現的功能也能夠經過傳統 命令式編程 方式實現。之因此推薦使用過濾器編程,是由於過濾器在優化系統/代碼結構,提升代碼可讀性上更優異。web

接下來用一個簡單的例子說明下,編程

public class LogErrorFilter : FilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        LogHelper.LogDetail(filterContext.Exception);
    }
}

Filter的使用

  1. 使用聲明的方式在Controllermvc

    [LogErrorAttribute]
    public class HomeController : Controller
    {
    public ActionResult Index()
    {
    throw new NotImplementedException();
    }
    public ActionResult Login()
    {
    throw new NotImplementedException();
    }
    }優化

LogErrorAttribute將會做用在Index和Login兩個Action上url

  1. 使用聲明的方式在Action上code

    public class HomeController : Controller
    {
    [LogErrorAttribute]
    public ActionResult Index()
    {
    throw new NotImplementedException();
    }
    public ActionResult Login()
    {
    throw new NotImplementedException();
    }
    }blog

LogErrorAttribute僅會做用在Index一個Action上。繼承

  1. 將LogErrorAttribute註冊到 HttpApplication中,即在Global的Application_Start方法作以下操做接口

    protected void Application_Start()
     {
         GlobalFilters.Filters.Add(new LogErrorAttribute());
     }

    若是項目中存在FilterConfig類,則能夠這樣操做ip

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
     {
         filters.Add(new HandleErrorAttribute());
         filters.Add(new LogErrorAttribute());
     }

這樣,LogErrorAttribute就會記錄該web項目全部Action引起的異常。

System.Web.Mvc 下的過濾器接口

自定義Authorization Filter

自定義的受權過濾器能夠經過繼承FilterAttribute和實現IAuthorizationFilter來實現,覆寫的接口OnAuthorization
對於須要攔截的請求只須要給AuthorizationContext的Result屬性賦值便可。

public class LoginCheckFilterAttribute : FilterAttribute,IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        if (!AuthorizeCore(filterContext)) //具體驗證用戶的邏輯
        {
            var url = HttpUtility.UrlEncode(filterContext.HttpContext.Request.RawUrl);
            filterContext.Result = new RedirectResult((new UrlHelper(filterContext.RequestContext)).Content("/Login/Index?returnUrl=" + url));
        }
    }
}
相關文章
相關標籤/搜索