通过 ActionExecutingContext 从控制器 .Net Core 获取自定义属性

use*_*375 9 .net c# asp.net-core

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

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

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

属性定义:

public class MyAttribute : Attribute
{
    private readonly string _parameter;

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

    public string Parameter { get { return _parameter; } }
}
Run Code Online (Sandbox Code Playgroud)

代码用法:

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

use*_*375 13

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

var attrib = (filterContext.ActionDescriptor as ControllerActionDescriptor).MethodInfo.GetCustomAttributes<MyAttribute>().FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)


Rod*_*voi 8

对于 ASP.NET Core 3+:

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

Run Code Online (Sandbox Code Playgroud)


Rya*_*vis 7

无需运行时强制转换的另一种选择:

public class MyAttribute :  Microsoft.AspNetCore.Mvc.Filters.ActionFilterAttribute {
  // same content as in the question
}
Run Code Online (Sandbox Code Playgroud)

通过继承自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
    }
}
Run Code Online (Sandbox Code Playgroud)

我不确定这是否比强制转换更脏或更干净ControllerActionDescriptor,但如果您控制属性,它是一个选项。

  • 更直接的方法可能是“bool isAttributeSet = filterContext.ActionDescriptor.FilterDescriptors.Any(fd =&gt; fd.Filter is MyAttribute);” (5认同)