.NET MVC Filter

来源:互联网 发布:spss mac 人大 编辑:程序博客网 时间:2024/06/07 15:39

1. 常用的过滤器接口

IAuthorizationFilter:在所有的Filter中最早执行的,可用于Action的权限控制

IActionFilter:在Action执行的前后,可用于请求跳转、记录Action执行日志

IResultFilter:在Result执行的前后,可用于记录Result执行日志

IExceptionFilter:在任何异常发生时,可用于记录日志、处理异常、指定错误页面

 

2.
eg: 作用在 Result上的过滤器

 
1. 新建一个类继承 FilterAttribute 实现 IActionFilter接口 重写接口中的方法

 public class UserFilter: FilterAttribute,IActionFilter
    {


        public void OnActionExecuted(ActionExecutedContext filterContext)
        {
          
        }

        public void OnActionExecuting(ActionExecutingContext filterContext)
        {
            HttpSessionStateBase session=  filterContext.HttpContext.Session;   //取到Session
           
            //get the controller and result name and field value

            string controllName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;   //取到当前访问的Controller和Result的名称

            string actionName = filterContext.ActionDescriptor.ActionName;

            session["controllName"] = controllName;
            session["actionName"] = actionName;

            string fileName = filterContext.RouteData.Values["fileName"]==null?"":filterContext.RouteData.Values["fileName"].ToString();

            //可以取到URL中的传递参数的值

            HttpRequestBase request  = filterContext.HttpContext.Request;
            string fileNameString = request.QueryString["fileName"];

            //判断是否登录,以及判断后的跳转
            string user = (string)session["user"];

            if(null == user){
                filterContext.Result = new RedirectResult("/File/ListFiles");  //没有登录的话跳转到指定页面
            }
            else if (!"admin".Equals(user))
            {
                filterContext.Result = new RedirectResult("/File/FieldTest2");
            }
           
        }
    }

 

2.  在ActionResult方法上只需指定自定义的Filter的类名即可


       [UserFilter]
        public ActionResult FieldSubmit3(FieldModel fileModel)
        {
        
            ViewData["fileModel"] = fileModel;
            return View("FieldTest3");
        }

 

3. 如果在global.asax中, route的配置如下:


 routes.MapRoute("Flow", "Flow/FlowDetail/{flowId}", new { Controller = "Flow", action = "FlowDetail", fileName = UrlParameter.Optional });


  则在 ActionFilter中想取到route中flowId的值如下:
 
   object flowId = filterContext.RouteData.Values["flowId"];


0 0