Asp.Net MVC学习笔记-Filter

   Asp.Net MVC的四种过滤器类型:

  1. ActionFilter(方法过滤器):接口名为[IActionFilter],在控制器方法调用前/后执行
  2. ResultFilter(结果过滤器):接口名为[IResultFilter],在控制器方法调用完,跳转至view页面前/后执行
  3. AuthorizationFilter(授权过滤器):接口名为[IauthorizationFilter],所有过滤器中最先执行的
  4. ExceptionFilter(异常处理过滤器):接口名为[IExceptionFilter],在控制器方法抛出异常时执行

在项目中新建文件夹命名为Filter,创建新的类型时为了遵循约定名称以Attribute结尾。

AuthorizeAttribute   

   Filter文件夹下创建新类型MyAuthorizeAttribute,继承AuthorizeAttribute类:

 

/// <summary>
    /// 用户权限验证过滤器
    /// </summary>
    public class MyAuthorizeAttribute : AuthorizeAttribute
    {

        public override void OnAuthorization(AuthorizationContext filterContext)
        {          
           filterContext.HttpContext.Response.write("Your Authorize");//你自己的权限验证逻辑
           filterContext.Result = new RedirectResult("URL");//验证不通过则跳转到指定地址
        }
    }

 

    对需要验证的类添加[Filter.MyAuthorize]标记,Authoize过滤器是用于全局过滤的,主要做登录验证和权限验证,在App_Start下面的FilterConfig类的RegisterGlobalFilters中添加:

 

filters.Add(new MyAuthorizeAttribute()); 

 

在全局中注册过滤器,则所有控制器的所有Action都会执行这个过滤器。

HandleErrorAttribute  

    Filter文件夹下创建新类型MyHandleErrorAttribut继承HandleErrorAttribute:

 

/// <summary>
    /// 用于捕获action中的未被try{}catch{}捕获的异常
    /// </summary>
    public class MyHandleErrorAttribut : HandleErrorAttribute
    {
        public override void OnException(ExceptionContext filterContext)
        {

            //1、获取异常对象
            Exception ex = filterContext.Exception;
            string action = HttpContext.Current.Request.CurrentExecutionFilePath;//获取发生异常的acition
            string msg = "发生错误的Action名称:" + action + ",错误信息:" + ex.Message;

           //这里对异常进行处理,如保存异常日志等

            //2、重定向友好页面
            filterContext.Result = new RedirectResult("~/error.html");

            //3、 通知MVC框架,现在这个异常已经处理掉
            filterContext.ExceptionHandled = true;

            base.OnException(filterContext);

        }
    }

 

异常处理一般都是放在全局过滤器上面的,只要任意Action报错就会执行过滤器中的代码。修改App_Start下面的FilterConfig的代码:

  public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new MyAuthorizeAttribute()); 
            filters.Add(new LogHandleErrorAttribut());
        }
    }

    这里做个简单的记录做备忘之用。

 

posted @ 2023-03-22 00:15  放羊娃  阅读(73)  评论(0编辑  收藏  举报