Filter,在MVC中我们通常将Filter定义成Attribute特性 来供Controller 或者Action 方法调用。 FilterAttribute 是所有Filter 的基类。
而 FilterAttribute 实现了IMvcFilter 接口。
GIobalFilterCollection :全局Filter。如下代码注册全局 Filter。
public static void RegisterGlobalFilters(GlobalFilterCollection filters) { //filters.Add(new HandleErrorAttribute()); GlobalFilters.Filters.Add(new BazAttribute()); }
自定义Filter特性
public abstract class FilterBaseAttribute : FilterAttribute, IActionFilter { public void OnActionExecuted(ActionExecutedContext filterContext) { } public void OnActionExecuting(ActionExecutingContext filterContext) { } } public class FooAttribute : FilterBaseAttribute { } public class BarAttribute : FilterBaseAttribute { } public class BazAttribute : FilterBaseAttribute { }
AttributeUsageAttribute: 设置AllowMultiple=false,表示filter在同一个目标元素上只能使用一次 如下代码
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)] public class FooAttribute : FilterAttribute, IActionFilter { public void OnActionExecuted(ActionExecutedContext filterContext) { } public void OnActionExecuting(ActionExecutingContext filterContext)
然后我们在三个地方设置 Foo的Filter
全局:
public static void RegisterGlobalFilters(GlobalFilterCollection filters) { //filters.Add(new HandleErrorAttribute()); GlobalFilters.Filters.Add(new FooAttribute()); }
controller 和 action
[Foo] public class HomeController : Controller { public ActionResult Index() { ReflectedControllerDescriptor controllerDescriptor = new ReflectedControllerDescriptor(typeof(HomeController)); ActionDescriptor actionDescriptor = controllerDescriptor.FindAction(ControllerContext, "DemoAction"); IEnumerable<Filter> filters = FilterProviders.Providers.GetFilters(ControllerContext, actionDescriptor); return View(filters); } [Foo] public void DemoAction() { } }
运行会发现 只有一个filter被执行了。
FiterInfo: