namespace System.Web.Mvc{ // 摘要:定义结果筛选器所需的方法。 public interface IResultFilter{ // 摘要:在操作结果执行后调用。 // 参数:filterContext: // 筛选器上下文。 void OnResultExecuted(ResultExecutedContext filterContext); // 摘要:在操作结果执行之前调用。 // 参数:filterContext: // 筛选器上下文。 void OnResultExecuting(ResultExecutingContext filterContext); } }
动作方法如何返回动作结果,让用户能够将动作方法的意图与动作方法的执行分离。将结果过滤器运用于一个动作方法时会在动作方法返回结果时、但在执行该动作结果之前调用OnResultExecuting。动作结果执行之后调用OnResultExecuted
内建的动作过滤器和结果过滤器
Mvc框架包含一个内建的类,可以用来创建动作过滤器和结果过滤器,这个类的名称ActionFilterAttribute
namespace System.Web.Mvc{ // 摘要:表示筛选器特性的基类。 public abstract class ActionFilterAttribute : FilterAttribute, IActionFilter, IResultFilter{ // 摘要:在执行操作方法后由 ASP.NET MVC 框架调用。 // 参数:filterContext: // 筛选器上下文。 public virtual void OnActionExecuted(ActionExecutedContext filterContext); // 摘要:在执行操作方法之前由 ASP.NET MVC 框架调用。 // 参数:filterContext: // 筛选器上下文。 public virtual void OnActionExecuting(ActionExecutingContext filterContext); // 摘要:在执行操作结果后由 ASP.NET MVC 框架调用。 // 参数:filterContext: // 筛选器上下文。 public virtual void OnResultExecuted(ResultExecutedContext filterContext); // 摘要:在执行操作结果之前由 ASP.NET MVC 框架调用。 // 参数:filterContext: // 筛选器上下文。 public virtual void OnResultExecuting(ResultExecutingContext filterContext); } }
使用这个类的唯一好处是不需要重写和实现不打算使用的方法。除此之外,直接实现过滤器接口没有任何好处
自定义实例:
public class ProfileAllAttribute: ActionFilterAttribute{ private Stopwatch timer; public override void OnActionExecuting(ActionExecutingContext filterContext){ timer = Stopwatch.StartNew(); } public override void OnActionExecuted(ActionExecutedContext filterContext){ timer.Stop(); filterContext.HttpContext.Response.Write( string.Format("<div>Total elapsed time:{0}</div>", timer.Elapsed.TotalSeconds)); } } public class HomeController : Controller{ [ProfileAll] public ActionResult Index(){ return View();} }
其它过滤器属性:
public abstract class Controller : ControllerBase, IActionFilter, IAuthenticationFilter, IAuthorizationFilter, IDisposable, IExceptionFilter, IResultFilter, IAsyncController, IController, IAsyncManagerContainer
过滤器的几种实现形式:
①全局过滤器
在FilterConfig中直接注册实现类
②实现接口
③注解
对过滤器执行排序
过滤器是按类型执行的其顺序:授权-》Action-》result。如果有未处理异常,框架在任一阶段都会执行异常过滤器
namespace System.Web.Mvc { // 摘要:表示操作和结果筛选器特性的基类。 public abstract class FilterAttribute : Attribute, IMvcFilter{ // 摘要: 获取或设置一个值,该值指示是否可指定筛选器特性的多个实例。 // 返回结果:如果可指定筛选器特性的多个实例,则为 true;否则为 false。 public bool AllowMultiple { get; } // 摘要: 获取或者设置执行操作筛选器的顺序。 // 返回结果:执行操作筛选器的顺序。 public int Order { get; set; } } }
内建过滤器
过滤器 描述 RequireHttps 强迫Action使用Https协议 OutputCache 缓存一个Action的 ValidateInputand ValidationAntiForgeryToken 与安全性有关的授权过滤器 AsyncTimeout NoAsyncTimeout 用户异步控制器 ChildActionOnlyAttribute 一个支持Html.action和Html.RenderAction辅助器方法的过滤器
RequireHttps
RequireHttps过滤器让Action强制使用HTTPS协议。他将用户浏览器重定向到同一个动作,但使用‘https://'协议前缀
在形成不安全请求时,重写HandledNonHttpsRequest(),以创建自定义行为,该过滤器仅用于GET请求,POST则会丢掉数据;该过滤器时授权过滤器