覆盖特定的操作过滤器

问题描述 投票:0回答:2

在我的 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,或者只是列出要覆盖的过滤器。 谢谢您的帮助。

c# asp.net-web-api2 custom-action-filter
2个回答
1
投票

我创建了一个特定属性

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

0
投票

您可以使用

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
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.