我需要在Taghelper(asp.net core2.0)中获取ActionInfo动作。控制器,动作,(或可能是区域)名称是我唯一拥有的东西。而不是在启动时获取所有操作。有没有办法在运行时动态获取ActionInfo的动作(比如使用反射)?
答案 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);
}
}
所以上面的目标实现了你的目标,但也有一些缺点:
但如果这些限制很好,它应该允许:
<target destination-name="Microsoft">Microsoft</target>
可能存在一些错误,我写得很快。但这应该是一个坚实的起点。