8.0过滤器和过滤器中常用的方法
过滤器 (利用过滤器实现统一登录验证,和统一异常捕获)
1、action过滤器
2、Result过滤
具有默认实现类:ActionFilterAttribute (特性标签)
自己定义一个类重写:
1、onactionExecuting() ---> 在action方法进入之前执行2、onactionExecuted() -->执行完action方法代码以后执行3、onResultExecuting() ->在写入response结果之前执行4、onResultExecuted() ->在写入response结果之后执行
注意:1.执行 onactionExecuting 之前是进入到了action方法体的但是没有执行方法体的2.Result的两个方法总是在写入Response前后执行的3.如果是视图那么在我们返回view之后回调用视图引擎,然后在MVC底层执行Excute前后执行Result的两个方法的还有视图时的Response是在Excute中执行
3.在执行所有的过滤器前会执行的过滤器 AuthAttribute,也是继承ActionFilterAttribute 父类:ActionFilterAttribute
注意:
forms验证:所以如果不是用此过滤器来进行统一的forms登录验证,则应该注释base.OnAuthorization()
这样才方便使用 在使用AuthAttribute时必须注释调用父类的父类方法,不然会报错
例如: //base.OnAuthorization(filterContext);
4.异常处理过滤器ExpAttribute 父类:HandleErrorAttribute 于其他的特性标签的父类不同
注意点:
1:告诉MVC框架异常我已经处理完毕,你不需要抛出异常黄页
filterContext.ExceptionHandled = false; //当此值为false时MVC会自动跳转到Error.cshtml页面了
2:我们在异常过滤器的Error的页面上加一个@model HandleErrorInfo 我们可以通过Model获取到控制器和action名称、
@model HandleErrorInfo
控制器:@Model.ControllerName
方法名称:@Model.ActionName异常信息:@Model.Exception.ToString()
设置统一的报错设置:好处我们不用写try Catch 语句,因为所有的异常都会跳转到我们指定的系统自带的Error页面
<customErrors mode="On" defaultRedirect="Error"> model有3钟类型:off 关闭 On 打开 RemoteOnly 远程
</customErrors>defaultRedirect:表示有异常会默认的跳转的地址
注意这个配置文件是加载根目录的配置文件的 <system.web>下的
5.过滤器中的filterContext的一些常用方法
1.判断当前的action是否贴了指定的标签 false是表示不去当前这个类的父类中查找
if (filterContext.ActionDescriptor.IsDefined(typeof(SkipLoggerAttribute), false))
2.判断当前的控制器是否贴了指定的标签
if (filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(SkipLoggerAttribute), false))
3.获取action名称:filterContext.ActionDescriptor.ActionName;
4:获取控制器名称:filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
5:获取Action集合: filterContext.ActionParameters;
6. 获取当前请求的url对应的控制器值,action值,参数值
var c = filterContext.RouteData.Values["controller"];
var a = filterContext.RouteData.Values["action"];
var id = filterContext.RouteData.Values["id"];
7. 将当前action方法的返回类型换成指定的类型: filterContext.Result =例如:json
8.获取区域名称,使用固定的key :area去DataTokens中获取区域名称即可
if (filterContext.RouteData.DataTokens.ContainsKey("area"))
9.可以通过GetCustomAttributes()获取当前action上面贴的SkipLoggerAttribute类的对象实例数组
object[] arrts = filterContext.ActionDescriptor.GetCustomAttributes(typeof(SkipLoggerAttribute), false);
object[] arrts = filterContext.ActionDescriptor.GetCustomAttributes(typeof(SkipLoggerAttribute), false);
10.获取控制上的SkipLoggerAttribute类的对象实例数组
filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(SkipLoggerAttribute), false);
浙公网安备 33010602011771号