覆盖特定的操作过滤器

时间:2018-12-12 11:57:28

标签: c# asp.net-web-api2 custom-action-filter

在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添加到操作中: / p>

[OverrideActionFilters]
[MyActionFilterAttribute(myProperty: false)]
public IHttpActionResult MyCation()
{
  //Some staff here
}

但是现在由于使用OverrideActionFilters,我的自定义验证不再起作用,是否有任何方法可以重新定义OverrideActionFilters,或者只是列出要覆盖的过滤器。 谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我已经创建了特定的属性python manage.py runserver 0:8000 --insecure,然后从DoMyPropertyAttribute中删除了该属性。 在MyActionFilterAttribute中,我检查操作是否具有`DoMyPropertyAttribute,如果是,则执行特定工作:

MyActionFilterAttribute

通常,如果要覆盖动作过滤器,则只需跳过它,然后创建一个与所需行为匹配的特定动作过滤器。 要跳过动作过滤器,我们可以执行以下操作:

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
    }
  }
}