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);

     10.获取控制上的SkipLoggerAttribute类的对象实例数组
          filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(SkipLoggerAttribute), false);
          
      
           
  
   
  

posted on 2015-05-10 17:03  阿兴的平凡世界  阅读(274)  评论(0)    收藏  举报

导航