Я предпочитаю решение, изложенное здесь .Хотя это не такое универсальное решение, как ваше, я нашел его более простым.
В моем случае я искал способ включить CompressionFilter для всего, кроме нескольких элементов.Поэтому я создал пустой атрибут следующим образом:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public sealed class DisableCompression : Attribute { }
Затем в главном атрибуте проверьте наличие атрибута следующим образом:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class CompressionFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
bool disabled = filterContext.ActionDescriptor.IsDefined(typeof(DisableCompression), true) ||
filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(DisableCompression), true);
if (disabled)
return;
// action filter logic here...
}
}
Хотя на странице, на которую я ссылался, упоминаетсято, что это для MVC 3, похоже, достаточно хорошо работает и в MVC 1.
РЕДАКТИРОВАТЬ: показывает некоторое использование здесь в ответ на комментарии.До того, как я внес изменения выше, он выглядел именно так, за исключением того, что без атрибута [DisableCompression] отмечен метод, который я хотел исключить.Никакого другого рефакторинга не происходит.
[CompressionFilter]
public abstract class BaseController : Controller
{
}
public class SomeController : BaseController
{
public ActionResult WantThisActionCompressed()
{
// code
}
[DisableCompression]
public ActionResult DontWantThisActionCompressed()
{
// code
}
}