【问题标题】:Override a specific Action filter覆盖特定的操作过滤器
【发布时间】:2019-05-13 12:42:01
【问题描述】:

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

【问题讨论】:

  • 您能否澄清一下这与问题标题的对应关系?
  • 对不起,我忘记更新标题了
  • 嗯,首先,授权过滤器不应该是操作过滤器。这就是IAuthorizationFilters 存在的原因。它们在生命周期中的不同点运行(在操作过滤器之前),并且它们还被传递了一个 ActionFilters 没有的 AuthorizationContext。如果设置了某个值,您可以轻松构建一种机制使过滤器不执行任何操作
  • 假设这不是授权属性,只是一个简单的过滤器,我已经更新了问题

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


【解决方案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
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 2015-07-23
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多