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

时间:2017-01-23 09:55:24

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

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

'ActionDescriptor'不包含' GetCustomAttributes '的定义,并且没有扩展方法' GetCustomAttributes '接受第一个类型为'ActionDescriptor'的参数可以找到

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();
}

4 个答案:

答案 0 :(得分:3)

希望能帮助别人,这就是我的所作所为:

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

答案 1 :(得分:3)

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

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更脏或更干净,但如果你控制属性,这是一个选项。

答案 2 :(得分:2)

对于ASP.NET Core 3 +:

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

答案 3 :(得分:1)

为什么不使用:

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