zoukankan      html  css  js  c++  java
  • MVC之过滤器

    1.过滤器

    《a》:Authorization 默认实现 AuthorizeAttribute身份验证过滤器,首先运行,在其他过渡器的操作操作方法前执行;
    《b》:Action 运行之前 和之后的动作方法;

     public class MyAction:ActionFilterAttribute
        {
            public override void OnResultExecuting(ResultExecutingContext filterContext)
            {
                //base.OnResultExecuting(filterContext);
                filterContext.HttpContext.Response.Write("视图执行前 <br>");
            }
    
            public override void OnResultExecuted(ResultExecutedContext filterContext)
            {
               // base.OnResultExecuted(filterContext);
                filterContext.HttpContext.Response.Write("视图执行后 <br>");
            }
    
    
            //表示行为处理前,需要执行的代码
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                //base.OnActionExecuting(filterContext);
                filterContext.HttpContext.Response.Write("行为处理前 <br>");
            }
            //表示行为处理后,需要执行的代码
            public override void OnActionExecuted(ActionExecutedContext filterContext)
            {
                //base.OnActionExecuted(filterContext);
                filterContext.HttpContext.Response.Write("行为处理后 <br>");
            }
        }


    《c》:Result 运行前后执行的操作结果;
    《d》:Exception 如果只运行另一个过渡器,操作方法或行动结果抛出一个异常。

    两种实现方式:第一种自定义类实现类AuthorizeAttribute 重写方法

    public class MyAuthorization : AuthorizeAttribute
        {
            public override void OnAuthorization(AuthorizationContext filterContext)
            {
                //如果保留,则会运行.net framework自已定义 好的身份验证; 如果希望走自己定义的身份验证,则删除如下代码。
               // base.OnAuthorization(filterContext);
    
    
                //如果希望跳转到另外一个页面,需要使用filterContext.Result, 而不是使用filterContext.HttpContext.Response.Redirect("");因为Redirect不会使服务器停止。
              //  filterContext.HttpContext.Response.Redirect("");
               // filterContext.Result = new RedirectResult(UrlHelper.GenerateUrl("","Login","UserInfo"));
    
                filterContext.HttpContext.Response.Write("123");
    
                //路由信息
                //filterContext.RouteData
    
    
                //校验用户是否登陆
               
                    //var routeDictionary = new System.Web.Routing.RouteValueDictionary { { "action", "Login" }, { "controller", "Account" } };
    
                    //filterContext.Result = new RedirectToRouteResult(routeDictionary);
                
            }
        }

    然后在控制器的方法中添加该特性如下:

     // [MyAuthorization]  //表示当前类下面的所有行为在执行前都要  执行身份验证过滤器。
        public class HomeController : Controller
        {
            //
            // GET: /Home/
    
            [MyAuthorization]  //表示当前行为在执行前执行身份验证过滤器。
            public ActionResult Index()
            {
                return View();
            }
            //过渡器的第二种实现方式:重写控制器的方法,这样,会应用于所有的行为:
            protected override void OnAuthorization(AuthorizationContext filterContext)
            {
                filterContext.HttpContext.Response.Write("456");
            }
        }

    该特性有 三种添加方法:1:直接在方法上添加特性,2:在控制器上添加,

    3:在Global的 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);中添加如下:

     public static void RegisterGlobalFilters(GlobalFilterCollection filters)
            {
                filters.Add(new HandleErrorAttribute());
                //在全局中注册过滤器,那么所有的控制器的的所有行为都要执行该 过渡器
               // filters.Add(new MyAuthorization());
            }

    //过渡器的第二种实现方式:重写控制器的方法,这样,会应用于所有的行为:

       // [MyAuthorization]  //表示当前类下面的所有行为在执行前都要  执行身份验证过滤器。
        public class HomeController : Controller
        {
            //
            // GET: /Home/
    
            [MyAuthorization]  //表示当前行为在执行前执行身份验证过滤器。
            public ActionResult Index()
            {
                return View();
            }
            //过渡器的第二种实现方式:重写控制器的方法,这样,会应用于所有的行为:
            protected override void OnAuthorization(AuthorizationContext filterContext)
            {
                filterContext.HttpContext.Response.Write("456");
            }
        }

    或者是新建一个控制器,添加过渡器的方法再使想应用该 过渡器的控制器 继承于该控制器:

    namespace t1_Filter.Controllers
    {
        public class MyBaseController : Controller
        {
            //过渡器的第二种实现方式:重写控制器的方法,这样,会应用于所有的行为:
            protected override void OnAuthorization(AuthorizationContext filterContext)
            {
                filterContext.HttpContext.Response.Write("456");
            }
        }
    }
      public class HomeController : MyBaseController
  • 相关阅读:
    有用的Python模块
    Python中for循环搭配else的陷阱
    MySQL实用操作
    Pycharm常用快捷键
    MySQL基础
    HTML基础
    MySQL基础
    HTTP连接管理
    TCP连接的建立和终止
    TCP数据流
  • 原文地址:https://www.cnblogs.com/haofaner/p/5885021.html
Copyright © 2011-2022 走看看