ASP.NET MVC的过滤器

何谓过滤器

过滤器又名为筛选器,能够为我们优雅的处理某一类需求提供解决方案,比如用户登录、自定义数据上下文初始化、捕获异常、发布公告等。从功能性上来讲过滤器没什么与优势,即过滤器可实现的功能也可以通过传统 命令式编程 方式实现。之所以推荐使用过滤器编程,是因为过滤器在优化系统/代码结构,提高代码可读性上更优异。

接下来用一个简单的例子说明下,

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

Filter的使用

  1. 使用声明的方式在Controller

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

LogErrorAttribute将会作用在Index和Login两个Action上

  1. 使用声明的方式在Action上

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

LogErrorAttribute仅会作用在Index一个Action上。

  1. 将LogErrorAttribute注册到 HttpApplication中,即在Global的Application_Start方法做如下操作

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

如果项目中存在FilterConfig类,则可以这样操作

    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));
        }
    }
}

posted on 2017-05-09 16:38  朝曦  阅读(173)  评论(0编辑  收藏  举报

导航