美文网首页
二刷:MVC(2) 过滤器

二刷:MVC(2) 过滤器

作者: 山猪打不过家猪 | 来源:发表于2022-11-27 17:58 被阅读0次

    一. 过滤器

    1.身份验证过滤器

    image.png
    image.png

    1.2自定义过滤器

    创建文件夹Filters用来存放所有的过滤器

    • 1.添加一个MyAuthorization.cs
    namespace filterTest.Filters
    {
        public class MyAuthorization : AuthorizeAttribute
        {
            public override void OnAuthorization(AuthorizationContext filterContext)
            {
                //这个是默认mvc的身份验证,自定的需要删除
                //base.OnAuthorization(filterContext);
    
                //1.跳转到另外一个页面使用Result
                //filterContext.Result
    
                //2.获取路由数据:上下文匹配到的路由数据,得到一个对象
                //filterContext.RouteData
    
                //3.获取上下文
                filterContext.HttpContext.Response.Write("123");
            }
        }
    }
    

    HomeController.cs:自定的过滤器当特性使用,执行Index()前,会先执行过滤器

    
    namespace filterTest.Controllers
    {
        public class HomeController : Controller
        {
            // GET: Home
            [MyAuthorization]
            public ActionResult Index()
            {
                return View();
            }
        }
    }
    

    Index.cshtml

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
    </head>
    <body>
        <h2>Home页面</h2>
    </body>
    </html>
    
    image.png
    • 上面方式可以给Action独立添加过滤,如果想给整个过滤器或类添加,则直接添加到该控制器上面
    namespace filterTest.Controllers
    {
        [MyAuthorization]
        public class HomeController : Controller
        {
            // GET: Home
            public ActionResult Index()
            {
                return View();
            }
            public ActionResult Show()
            {
                return View();
            } 
        }
    }
    
    • 如果想给该项目所有的控制器添加过滤器,就可以设置全局过滤器,在App_Start的文件夹下FilterCongfig.cs添加自己的过滤器
    namespace filterTest
    {
        public class FilterConfig
        {
            public static void RegisterGlobalFilters(GlobalFilterCollection filters)
            {
                filters.Add(new HandleErrorAttribute());
                //自定义过滤器
                filters.Add(new MyAuthorization());
            }
        }
    }
    

    此时不管是Home还是Person控制器,都会使用该过滤器

    1.3实现过滤器的第二种方法

    重写控制器方法:该方法会应用到该控制器下,所有的Action,这里 Index()和Show()都会,但是Person控制器则不

    namespace filterTest.Controllers
    {
        public class HomeController : Controller
        {
            // GET: Home
            public ActionResult Index()
            {
                return View();
            }
    
            public ActionResult Show()
            {
                return View();
            }
    
            protected override void OnActionExecuted(ActionExecutedContext filterContext)
            {
                filterContext.HttpContext.Response.Write("我是第二种过滤器方法");
            }
        }
    }
    

    1.4通过更改控制器继承,添加过滤器

    创建MyBaseController.cs

    namespace filterTest.Controllers
    {
        public class MyBaseController : Controller
        {
            protected override void OnActionExecuted(ActionExecutedContext filterContext)
            {
                filterContext.HttpContext.Response.Write("我是第二种过滤器方法");
            }
        }
    }
    

    HomeController.cs

    
    namespace filterTest.Controllers
    {
        public class HomeController : MyBaseController
        {
            // GET: Home
            public ActionResult Index()
            {
                return View();
            }
    
            public ActionResult Show()
            {
                return View();
            }
        }
    }
    

    2.异常处理过滤器

    创建自定义的异常处理过滤器MyException.cs

    namespace filterTest.Filters
    {
        public class MyException:HandleErrorAttribute
        {
            public override void OnException(ExceptionContext filterContext)
            {
                //注意:该代码不能被删,不然捕获不到异常
                base.OnException(filterContext);
                //1.记录日志
    
                //2.发生错误跳转到一个页面
                filterContext.Result = new RedirectResult("/Error/400.html");            
            }
        }
    } 
    

    如果给所有的网页的都添加这个错误处理,则在App_Start文件夹下的FilterConfig.cs

    namespace filterTest
    {
        public class FilterConfig
        {
            public static void RegisterGlobalFilters(GlobalFilterCollection filters)
            {
                //系统自带的错误过滤器需要删除
                //filters.Add(new HandleErrorAttribute());
                //注册自己的错误处理过滤器
                filters.Add(new MyException());
            }
        }
    }
    
    • 此时需要在Web.config下开启自定义的错误页
      <system.web>
          <customErrors mode="On">
              
          </customErrors>
        <compilation debug="true" targetFramework="4.7.1" />
        <httpRuntime 
    

    3. 行为结果过滤器

    image.png
    Filters里面添加MyActionFilter.cs
    namespace filterTest.Filters
    {
        public class MyAction:ActionFilterAttribute
        {
            //行为执行前,需要执行的代码
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                base.OnActionExecuting(filterContext);
            }
            //行为执行后,需要执行的代码
            public override void OnResultExecuted(ResultExecutedContext filterContext)
            {
                base.OnResultExecuted(filterContext);  
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:二刷:MVC(2) 过滤器

          本文链接:https://www.haomeiwen.com/subject/nxenxdtx.html