【问题标题】:Get custom attributes via ActionExecutingContext from controller .Net Core从控制器 .Net Core 通过 ActionExecutingContext 获取自定义属性
【发布时间】:2017-01-23 09:55:24
【问题描述】:

这曾经用于早期版本的 .Net。 .net 核心术语中的等价物是什么。现在我收到以下错误:

“ActionDescriptor”不包含“GetCustomAttributes”的定义,并且找不到接受“ActionDescriptor”类型的第一个参数的扩展方法“GetCustomAttributes” p>

public virtual void SetupMetadata(ActionExecutingContext filterContext)
{
    var myAttr = filterContext.ActionDescriptor.GetCustomAttributes(typeof(MyAttribute), false);
    if (myAttr.Length == 1)
        //do something
}

属性定义:

public class MyAttribute : Attribute
{
    private readonly string _parameter;

    public PageTitleAttribute(string parameter)
    {
        _parameter = parameter;
    }

    public string Parameter { get { return _parameter; } }
}

代码用法:

[MyAttribute("Attribute value is set here")]
public ActionResult About()
{
    ViewBag.Message = "Your application description page.";
    return View();
}

【问题讨论】:

    标签: c# .net asp.net-core


    【解决方案1】:

    希望能帮助到别人,这就是我所做的:

    var attrib = (filterContext.ActionDescriptor as ControllerActionDescriptor).MethodInfo.GetCustomAttributes<MyAttribute>().FirstOrDefault();
    

    【讨论】:

      【解决方案2】:

      另一个不需要运行时强制转换的选项:

      public class MyAttribute :  Microsoft.AspNetCore.Mvc.Filters.ActionFilterAttribute {
        // same content as in the question
      }
      

      通过从ActionFilterAttribute 继承,您的属性现在将出现在ActionDescriptor.FilterDescriptors 集合中,您可以搜索:

      public virtual void SetupMetadata(ActionExecutingContext filterContext)
      {
          var myAttr = filterContext.ActionDescriptor
              .FilterDescriptors
              .Where(x => x.Filter is MyAttribute)
              .ToArray();
          if (myAttr.Length == 1) {
              //do something
          }
      }
      

      我不确定这是否比投射到 ControllerActionDescriptor 更脏或更干净,但如果您控制该属性,这是一个选项。

      【讨论】:

      • 更直接的方式可能是bool isAttributeSet = filterContext.ActionDescriptor.FilterDescriptors.Any(fd =&gt; fd.Filter is MyAttribute);
      【解决方案3】:

      对于 ASP.NET Core 3+:

          var filters = context.Filters;
          // And filter it like this: 
          var filtered = filters.OfType<OurFilterType>();
      
      

      【讨论】:

        【解决方案4】:

        为什么不使用:

        filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(MyAttribute), false).Any()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-05
          • 2016-07-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多