MVC4 Filter (筛选器)

 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:

原文地址:https://www.cnblogs.com/dragon-L/p/5277470.html