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));
        }
    }
}
相关文章
相关标签/搜索