在我的 WebApi 2 应用程序中,我的基本控制器中有一个操作过滤器属性,该属性有一个布尔属性,其默认值可以在构造函数中设置:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyActionFilterAttribute : ActionFilterAttribute
{
public bool MyProperty {get; set;}
public MyActionFilterAttribute(bool myProperty = true)
{
MyProperty = myProperty;
}
public override void OnActionExecuting(HttpActionContext actionContext)
{
if(MyProperty)
{
//DO Something
}
}
}
我还在 webApi 配置中配置了
CustomValidatorFilter
:
config.Filters.Add(new CustomValidatorFilterAttribute());
在控制器的某些操作中,我想通过将
MyProperty
的值设置为 false
来覆盖 MyActionFilterAttribute 的行为,我已将 OverrideActionFilters
添加到我的操作中:
[OverrideActionFilters]
[MyActionFilterAttribute(myProperty: false)]
public IHttpActionResult MyCation()
{
//Some staff here
}
但是现在我的自定义验证由于使用
OverrideActionFilters
而不再工作,有没有办法重新定义 OverrideActionFilters,或者只是列出要覆盖的过滤器。
谢谢您的帮助。
我创建了一个特定属性
DoMyPropertyAttribute
,然后从 MyActionFilterAttribute
中删除了该属性。
在 MyActionFilterAttribute
中,我检查操作是否具有 `DoMyPropertyAttribute,如果是,我会执行特定的工作:
public class DoMyPropertyAttribute : Attribute
{
}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyActionFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
if(actionContext.ActionDescriptor.GetCustomAttributes<DoMyPropertyAttribute>().Any())
{
//DO Something
}
}
}
一般来说,如果我们想要覆盖某个动作过滤器,我们只需跳过它,然后创建一个与所需行为匹配的特定动作过滤器。 要跳过动作过滤器,我们可以这样做:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyActionFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
if(actionContext.ActionDescriptor.GetCustomAttributes<SkipMyActionFilterAttribute>().Any())
{
return;
}
//Do something
}
}
您可以使用
FindEffectivePolicy<TMetadata>()
方法 - 这将为您获取相关属性的值(即,将在操作中查找声明,如果未找到,将为您提供在控制器上声明的值)-
@参见 FilterContext.FindEffectivePolicy
public class MyActionFilterAttribute : ActionFilterAttribute
{
public bool MyProperty {get; set;}
public MyActionFilterAttribute(bool myProperty = true)
{
MyProperty = myProperty;
}
public override void OnActionExecuting(ActionExecutingContext context)
{
var effective = = context.FindEffectivePolicy<MyActionFilterAttribute>();
if(effective.MyProperty)
{
//DO Something
}
}
}