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

MVC - 16.MVC过滤器

public class MyActionFilterAttribute : ActionFilterAttribute
{ }

MVC - 16.MVC过滤器

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页面,

MVC - 16.MVC过滤器

2.3.全局Action特性

MVC - 16.MVC过滤器

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特性

MVC - 16.MVC过滤器

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

MVC - 16.MVC过滤器

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

MVC - 16.MVC过滤器

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

MVC - 16.MVC过滤器

6.AuthorizeAttribute 授权过滤器

6.1.执行的位置

MVC - 16.MVC过滤器

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

MVC - 16.MVC过滤器

上一篇:关于ueditor1.4.2 与Jquery 验证同时使用失效


下一篇:html页面源代码