二刷:MVC(2) 过滤器
2022-11-27 本文已影响0人
山猪打不过家猪
一. 过滤器
1.身份验证过滤器
image.pngimage.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.pngFilters里面添加
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);
}
}
}