MVC - 16.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

posted @ 2014-11-08 15:51  【唐】三三  阅读(326)  评论(0编辑  收藏  举报