Я не уверен, что есть простой способ удалить атрибуты в этой ситуации.Но я сделал нечто подобное для проекта, и то, что я сделал, поскольку только в нескольких случаях я не хотел, чтобы мой атрибут выполнялся, было создание двух атрибутов.
Мой первый атрибут был применен кмой базовый контроллер, как вы сделали, но он знал о существовании второго атрибута и, реализовав этот второй атрибут, я мог отключить запуск атрибута в базовом классе.
Не уверен, что это был лучшийрешение, но оно работало для меня.
Это было применено к базовому контроллеру:
/// <summary>
/// This is used to force the schema to HTTP is it is HTTPS.
/// RequireHttpsAttribute or OptionalHttpsAttribute takes precedence if used.
/// </summary>
public class RequireHttpAttribute : FilterAttribute, IAuthorizationFilter
{
public virtual void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext == null)
throw new ArgumentNullException("filterContext");
if (filterContext.HttpContext.Request.IsSecureConnection)
{
object[] attributes = filterContext.ActionDescriptor.GetCustomAttributes(true);
if (!attributes.Any(a => a is RequireHttpsAttribute || a is OptionalHttpsAttribute))
{
HandleHttpsRequest(filterContext);
}
}
}
protected virtual void HandleHttpsRequest(AuthorizationContext filterContext)
{
// only redirect for GET method, otherwise browser may not propogate the verb and request body correctly
if (!string.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
throw new InvalidOperationException(MvcResources.RequireHttpAttribute_MustNotUseSsl);
// redirect to HTTP version
string url = "http://" + filterContext.HttpContext.Request.Url.Host + filterContext.HttpContext.Request.RawUrl;
filterContext.Result = new RedirectResult(url);
}
}
Примерно так:
[RequireHttp]
public abstract class Controller : System.Web.Mvc.Controller
{
}
Тогда я мог бы использовать то, что эффективноатрибут dummy для его отключения.
/// <summary>
/// This attribute allows the action to be server on HTTP and HTTPS but neither is enforce.
/// RequireHttpsAttribute takes precedence if used.
/// </summary>
public class OptionalHttpsAttribute : FilterAttribute
{
// This is deliberately empty, the attribute is used by RequireHttpAttribute to stop it changing schema to HTTP
}
Примерно так:
[OptionalHttps]
public ActionResult OptionalHttps()
{
return View();
}