1.过滤器的使用(创建一个MyFilter文件夹存储所有的过滤器)
1.1 Authorization
1.1.1创建一个MyAuthorization继承自AuthorizatioAttribute
1.1.2重写OnAuthorization方法,传入一个filterContext
1.1.3 客户端重定向的时候不要使用filterContext.HttpContet.Response.Ridirect(string url),而是使用filterContext.Result,因为第一种不会让服务器段停止执行.
filterContext.Result=new RedirectResult(UrlHelper.GenerateUrl());
1.1.4 给要添加过滤的行为或者控制器中添加定义的过滤器:格式是[MyAuthorization],则有添加特性的过滤器获取方法就会先去执行过滤器中的内容,再执行行为.
namespace t1_Filter.Controllers
{
//当前控制器下的所有行为均进行定义的身份验证过滤器
[MyAuthorization]
public class HomeController : Controller
{
//
// GET: /Home/
//添加一个身份验证的过滤器
//[MyAuthorization]
public ActionResult Index()
{
return View();
}
public ActionResult Show()
{
return View();
}
}
}
1.1.5 当需要给所有控制器所有行为添加身份验证过滤器的时候.在global文件中注册
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
// 原来的身份验证过滤器
//filters.Add(new HandleErrorAttribute());
//在全局中注册过滤器,则所有控制器的所有行为,都会执行这个过滤器
filters.Add(new MyAuthorization());
}
1.1.6 第二种,使用在控制器中重写onAuthorization的方法来实现
protected override void OnAuthorization(AuthorizationContext filterContext)
{
filterContext.HttpContext.Response.Write("这是在控制器中重写的身份验证过滤器");
}
1.2 异常处理过滤器
使用的方法如身份验证过滤器,不过一般注册到Global文件的过滤器中
public override void OnException(ExceptionContext filterContext)
{
//以下代码不可以被删除,否则捕获不到异常
base.OnException(filterContext);
//记录日志
//页面跳转
filterContext.Result=new RedirectResult("/Error/404.html");
}
注意:要更改配置文件:在system.web节点中添加一个customErrors节点
<system.web>
<customErrors mode="On"></customErrors>
<system.web>
1.3 行为过滤器:继承自ActionFilterAttribute
1.3.1 OnActionExcuting(行为前)
1.3.2 OnActionExcuted(行为后)
1.4 结果过滤器:继承自ActionFilterAttribute
1.4.1 OnResultExcuting(结果执行前)
1.4.2 OnResultExcuted(结果执行后)
Demo:
public class MyAction:ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("自定义行为执行前方法<br/>");
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("自定义行为执行后方法<br/>");
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("结果执行前的方法<br/>");
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("结果执行后的方法<br/>");
}
}
总结:
=>过滤器的的实现由两种方式:
1.自定义类,然后给要执行的控制器或者方法添加特性
2.重写Controller类的方法
=>过滤器的种类4种:
1.身份验证过滤器
2.异常处理过滤器
3.行为过滤器
4.结果过滤器