public class Filter
{
public const int DefaultOrder = -1;
public Filter(object instance, FilterScope scope, int? order);
public object Instance { get; protected set; }
public int Order { get; protected set; }
public FilterScope Scope { get; protected set; }
}
public enum FilterScope
{
Action = 30,
Controller = 20,
First = 0,
Global = 10,
Last = 100
}
public interface IFilterProvider
{
IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor);
}
public static class FilterProviders
{
public static FilterProviderCollection Providers { get; }
}
public class FilterProviderCollection : Collection<IFilterProvider>
{
//其他成员
public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor);
}
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited=true, AllowMultiple=false)]
public abstract class FilterAttribute : Attribute, IMvcFilter
{
protected FilterAttribute();
public bool AllowMultiple { get; }
public int Order { get; set; }
}
public interface IMvcFilter
{
bool AllowMultiple { get; }
int Order { get; }
}
public abstract class ControllerDescriptor : ICustomAttributeProvider, IUniquelyIdentifiable
{
//其他成员
public virtual IEnumerable<FilterAttribute> GetFilterAttributes(bool useCache);
}
public abstract class ActionDescriptor : ICustomAttributeProvider, IUniquelyIdentifiable
{
//其他成员
public virtual IEnumerable<FilterAttribute> GetFilterAttributes(bool useCache);
}
public class FilterAttributeFilterProvider : IFilterProvider
{
public FilterAttributeFilterProvider();
public FilterAttributeFilterProvider(bool cacheAttributeInstances);
protected virtual IEnumerable<FilterAttribute> GetActionAttributes(ControllerContext controllerContext, ActionDescriptor actionDescriptor);
protected virtual IEnumerable<FilterAttribute> GetControllerAttributes(ControllerContext controllerContext, ActionDescriptor actionDescriptor);
public virtual IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor);
}
public abstract class Controller : ControllerBase,
IActionFilter,
IAuthorizationFilter,
IExceptionFilter,
IResultFilter,
...
{
//省略成员
}
public class ControllerInstanceFilterProvider : IFilterProvider
{
public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor);
}
public sealed class GlobalFilterCollection : IEnumerable<Filter>, IEnumerable, IFilterProvider
{
public GlobalFilterCollection();
public void Add(object filter);
public void Add(object filter, int order);
private void AddInternal(object filter, int? order);
public void Clear();
public bool Contains(object filter);
public IEnumerator<Filter> GetEnumerator();
public void Remove(object filter);
IEnumerator IEnumerable.GetEnumerator();
IEnumerable<Filter> IFilterProvider.GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor);
public int Count { get; }
}
public static class GlobalFilters
{
public static GlobalFilterCollection Filters { get; }
}
public static class FilterProviders
{
static FilterProviders()
{
Providers = new FilterProviderCollection();
Providers.Add(GlobalFilters.Filters);
Providers.Add(new FilterAttributeFilterProvider());
Providers.Add(new ControllerInstanceFilterProvider());
}
public static FilterProviderCollection Providers{get;private set;}
}
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
{}
public class MvcApplication : System.Web.HttpApplication
{
//其他成员
protected void Application_Start()
{
//其他操作
//RegisterGlobalFilters(GlobalFilters.Filters);
GlobalFilters.Filters.Add(new BazAttribute());
}
}
[Foo]
public class HomeController : Controller
{
public void Index()
{
ReflectedControllerDescriptor controllerDescriptor = new ReflectedControllerDescriptor(typeof(HomeController));
ActionDescriptor actionDescriptor = controllerDescriptor.FindAction(ControllerContext, "Data");
foreach (var filter in FilterProviders.Providers.GetFilters(ControllerContext, actionDescriptor))
{
Response.Write(string.Format("{0}<br/>",filter.Instance));
Response.Write(string.Format(" {0}: {1}<br/>", "Order",filter.Order));
Response.Write(string.Format(" {0}: {1}<br/><br/>", "Scope",filter.Scope));
}
}
[Bar]
public void Data()
{ }
}
public abstract class FilterBaseAttribute:FilterAttribute, IActionFilter
{
public void OnActionExecuted(ActionExecutedContext filterContext)
{}
public void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write(string.Format("{0}.OnActionExecuting()<br/>", this.GetType()));
}
}
[Foo]
public class HomeController : Controller
{
//其他成员
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
Response.Write("HomeController.OnActionExecuting()<br/>");
}
[Bar]
public void Data()
{ }
}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
public class FooAttribute : FilterAttribute, IActionFilter
{
public void OnActionExecuted(ActionExecutedContext filterContext)
{ }
public void OnActionExecuting(ActionExecutingContext filterContext)
{ }
}
[Foo]
public class HomeController : Controller
{
//其他成员
[Foo]
public void Data()
{ }
}
public class MvcApplication : System.Web.HttpApplication
{
//其他成员
protected void Application_Start()
{
//其他操作
//RegisterGlobalFilters(GlobalFilters.Filters);
GlobalFilters.Filters.Add(new FooAttribute());
}
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有