二刷:MVC(2) 过滤器

2022-11-27  本文已影响0人  山猪打不过家猪

一. 过滤器

1.身份验证过滤器

image.png
image.png

1.2自定义过滤器

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

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
namespace filterTest.Controllers
{
    [MyAuthorization]
    public class HomeController : Controller
    {
        // GET: Home
        public ActionResult Index()
        {
            return View();
        }
        public ActionResult Show()
        {
            return View();
        } 
    }
}
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());
        }
    }
}
  <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);  
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读