zoukankan      html  css  js  c++  java
  • 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:

  • 相关阅读:
    Neutron分析(5)—— neutron-l3-agent中的iptables
    Neutron分析(4)—— neutron-dhcp-agent
    Neutron分析(3)—— neutron-l3-agent
    Neutron分析(2)——neutron-server启动过程分析
    Neutron分析(1)——简介
    RDO部署openstack(3)
    RDO部署openstack(2)
    Peewee之playhouse中的数据库连接池(原创)
    图数据库简介(转)
    RESTful API 最佳实践(转)
  • 原文地址:https://www.cnblogs.com/dragon-L/p/5277470.html
Copyright © 2011-2022 走看看