zoukankan      html  css  js  c++  java
  • MVC

    filter

    • n. 滤波器;[化工] 过滤器;筛选;滤光器
    • vt. 过滤;渗透;用过滤法除去

    1.过滤器表

    过滤器类型

    接口

    默认实现

    描述

    Action IActionFilter ActionFilterAttribute 在动作方法之前及之后运行
    Result IResultFilter ActionFilterAttribute 在动作结果被执行之前和之后运行
    AuthorizationFilter IAuthorizationFilter AuthorizeAttribute 首先运行,在任何其它过滤器或动作方法之前
    Exception IExceptionFilter HandleErrorAttribute 只在另一个过滤器、动作方法、动作结果弹出异常时运行

    2.Action

    2.1.创建Action特性

    自定义一个ActionFilterAttribute类,使他继承自 ActionFilterAttribute

    image

    public class MyActionFilterAttribute : ActionFilterAttribute
    {

    }

    image

    2.2. Action方法 过滤器 类

    Filter/MyactionFilterAttribute.cs
    Filter/MyactionFilterAttribute.cs
    
    /// <summary>
        /// Action方法 过滤器 类
        /// </summary>
        public class MyActionFilterAttribute : ActionFilterAttribute
        {
            //执行Action方法之前
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                filterContext.HttpContext.Response.Write("执行Action方法之前 OnActionExecuting<br/>");
                base.OnActionExecuting(filterContext);
            }
    
            //执行Action方法之后
            public override void OnActionExecuted(ActionExecutedContext filterContext)
            {
                filterContext.HttpContext.Response.Write("执行Action方法之后 OnActionExecuted");
                base.OnActionExecuted(filterContext);
            }
        }

    Controller/HomeController.cs

    public class HomeController : Controller
        {
            //
            // GET: /Home/
            [Filter.MyActionFilter]
            public ActionResult Index()
            {
                Response.Write(" index输出文字判断 <br/>");
                return View();
            }
    
        }

    View/Index.cs

    @{
        ViewBag.Title = "Index";
    }
    
    <h2>Index</h2>
    我是Index页面,

    image

    2.3.全局Action特性

    image

    public class FilterConfig
        {
            public static void RegisterGlobalFilters(GlobalFilterCollection filters)
            {
                filters.Add(new HandleErrorAttribute());
                //添加全局 MyActionFilterAttribute
                filters.Add(new Filter.MyActionFilterAttribute());
            }
        }

    3.Reslut

    3.1.Action方法 过滤器 类

    Filter/YouResultFilterAtrribute.cs
    Filter/YouResultFilterAtrribute.cs
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace _16MVCFilter.Filter
    {
        /// <summary>
        /// Result 过滤器 - 加载的是视图 “Action” 方法的话,在加载视图前后调用
        /// </summary>
        public class YouResultFilterAtrribute : ActionFilterAttribute
        {
            /// <summary>
            /// 加载“视图”前
            /// </summary>
            /// <param name="filterContext"></param>
            public override void OnResultExecuting(ResultExecutingContext filterContext)
            {
                filterContext.HttpContext.Response.Write("3.执行 Result “视图” 方法之前 OnActionExecuting<br/>");
                base.OnResultExecuting(filterContext);
            }
            /// <summary>
            /// 加载“视图”后
            /// </summary>
            /// <param name="filterContext"></param>
            public override void OnResultExecuted(ResultExecutedContext filterContext)
            {
                filterContext.HttpContext.Response.Write("4.执行 Result “视图” 方法之后 OnActionExecuting<br/>");
                base.OnResultExecuted(filterContext);
            }
        }
    }

    3.2.特性使用

    Controller/HomeController.cs

    [Filter.MyActionFilter]
            [Filter.YouResultFilterAtrribute]
            public ActionResult Index()
            {
                Response.Write(" index输出文字判断 <br/>");
                return View();
            }

    3.3.全局Result特性

    image

    public class FilterConfig
        {
            public static void RegisterGlobalFilters(GlobalFilterCollection filters)
            {
                filters.Add(new HandleErrorAttribute());
                //添加全局 MyActionFilterAttribute
                filters.Add(new Filter.MyActionFilterAttribute());
                //添加全局 YOuResultFilterAttribute
                filters.Add(new Filter.YouResultFilterAtrribute());
            }
        }

    image

    4.过滤器上下文里RouteData中获取url数据

    RouteData

    1.获取Action方法名,

    2.Controller类名

    3.area区域名

    //执行Action方法之前
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                //action 方法
                string strAction = filterContext.RouteData.Values["action"].ToString();
                //controller 类名
                string strContoller = filterContext.RouteData.Values["controller"].ToString();
                //RouteData.DataTokens["area"] 取得区域名称
                string areaName = filterContext.RouteData.DataTokens["area"].ToString();
               base.OnActionExecuting(filterContext);
            }

    5.过滤器上下文里的补充-跳过Action方法(重要)

    Controller/HomeController.cs

    public class HomeController : Controller
    {
    //
    // GET: /Home/
    //[Filter.MyActionFilter]
    //[Filter.YouResultFilterAtrribute]
    [Filter.Hide]
    public ActionResult Index()
    {
    Response.Write(" index输出文字判断 <br/>");
    return View();
    }

    }
     
    5.1.另外一种获取请求的 类名 和 方法名
    5.2.检查被请求的方法 是否加了 Hide 特性(Attribute)
    OnActionExecuting方法
    OnActionExecuting方法
    
    public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                #region 1.0.RouteData
                //action 方法
                string strAction = filterContext.RouteData.Values["action"].ToString();
                //contoller 类名
                string strContoller = filterContext.RouteData.Values["controller"].ToString();
                //RouteData.DataTokens["area"] 取得区域名称
                //string areaName = filterContext.RouteData.DataTokens["area"].ToString();
                //*{controller}/{action}/{id}
                string s = ((System.Web.Routing.Route)(filterContext.RouteData.Route)).Url;
                #endregion
    
                #region 2.0.另外一种获取请求的 类名 和 方法名
                string strAction2 = filterContext.ActionDescriptor.ActionName;
                string strController2 = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
                #endregion
    
                #region 2.1.检查被请求的方法  是否加了 Hide 特性(Attribute)
                //2.1.检查被请求的方法  是否加了 Hide 特性(Attribute)
                if (filterContext.ActionDescriptor.IsDefined(typeof(Filter.Hide), false))
                {
                    //直接为请求 设置 返回结果 而不执行队形的 Action 方法,也不执行 OnActionExcuted,但是会执行 Result过滤器和生成视图
                    filterContext.Result = new ContentResult() { Content = "<br/>(11).后面直接跳过,!~~<br/>" };
                }
                #endregion
    
                filterContext.HttpContext.Response.Write("(1).执行Action方法之前 OnActionExecuting<br/>");
                base.OnActionExecuting(filterContext);
            }

    image

    看下图,执行后源代码对比,(5)使用hide特性不执行,执行(11),(2)onacgtionExrcuted不执行。

    image

    6.AuthorizeAttribute 授权过滤器

    6.1.执行的位置

    image

    6.2.注释掉base.OnAuthorization,是因为我们不用ASP.NET授权验证,用自己的

    image

  • 相关阅读:
    阿里巴巴集团2014年校园招聘系统project师北京笔试题
    HDU 3104 Combination Lock(数学题)
    MYSQL数据迁移
    nginx配置文件中的location中文详解
    使用JQuery解析、处理JSON数据(应用在课程表)
    OpenResty+lua+GraphicsMagick生成缩略图
    解决使用base64解码太慢的问题,原因是根本就不应该使用此方法解决。
    Bringing up interface eth0: Determining if ip address 10.109.67.81 is already in use for device eth0...
    高效访问Internet-启用ISA Server的缓存
    在OpenResty中使用lua-zlib的方法
  • 原文地址:https://www.cnblogs.com/tangge/p/4083521.html
Copyright © 2011-2022 走看看