如何通过asp.net core mvc中的控制器和动作名称获取ActionInfo的动作?

时间:2017-12-22 16:44:50

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

我需要在Taghelper(asp.net core2.0)中获取ActionInfo动作。控制器,动作,(或可能是区域)名称是我唯一拥有的东西。而不是在启动时获取所有操作。有没有办法在运行时动态获取ActionInfo的动作(比如使用反射)?

1 个答案:

答案 0 :(得分:0)

您可以通过以下方式构建属性集合:

publicstring GetHyperlinkAttributes<TEntity>(string name)
{
     PropertyInfo property = typeof(TEntity).GetProperty(name);
     object[] attributes = property.GetCustomAttributes(false);

     var collection = new List<string>();
     foreach(Attribute attribute in attributes)
     {
          var hyperlink = attribute as HyperlinkAttribute;
          if(!string.IsNullOrEmpty(hyperlink?.Target)
               return hyperlink.Target;
     }

     return String.Empty;
}

因此,对于上述情况,如果您创建了一个属性,它将在您通过name参数为给定属性传递给该方法的对象上查找属性Target。如果您想扩展,可以通过typeof(TEntity).GetProperties()遍历整个对象。

我添加了一些逻辑,让你知道,GetCustomAttributes将返回你属性的所有属性。因此,如果开发人员在字段中添加非HyperLinkAttribute属性,那么使用强制转换的行。这可以清理,但我想提醒你陷入困境。

如果存在以下内容:

[Target("https://microsoft.com")]
public string Example { get; set; }

上述方法将返回https://microsoft.com

现在,棘手的部分 - 你的标签助手。

public class TargetTagHelper : TagHelper
{
     public string DestinationName { get; set; }

     public override Process(TagHelperContext context, TagHelperOutput output)
     {
          output.TagName = "a";

          var  url = GetHyperLinkAttributes<Navigation>(DestinationName);
          output.Attributes.SetAttribute("href", url);
          output.Content.SetContent(url);
     }
}

所以上面的目标实现了你的目标,但也有一些缺点:

  • 在此示例中,我创建了一个名为navigation的对象。
  • 寻找一个属性,正确的值需要在标记中。
  • 如果属性或对象未正确映射,则难以排除故障并且容易损坏。

但如果这些限制很好,它应该允许:

<target destination-name="Microsoft">Microsoft</target>

可能存在一些错误,我写得很快。但这应该是一个坚实的起点。