1 namespace System.Web.Mvc {
3 using System.Collections.Concurrent;
5 using System.Web.Mvc.Resources;
7 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
8 public abstract class FilterAttribute : Attribute, IMvcFilter {
9 private readonly static ConcurrentDictionary<Type, bool> _multiuseAttributeCache = new ConcurrentDictionary<Type, bool>();
10 private int _order = Filter.DefaultOrder;
12 private static bool AllowsMultiple(Type attributeType) {
13 return _multiuseAttributeCache.GetOrAdd(
15 type => type.GetCustomAttributes(typeof(AttributeUsageAttribute), true)
16 .Cast<AttributeUsageAttribute>()
22 public bool AllowMultiple {
24 return AllowsMultiple(GetType());
33 if (value < Filter.DefaultOrder) {
34 throw new ArgumentOutOfRangeException("value", MvcResources.FilterAttribute_OrderOutOfRange);