IEnumerable模型的表TagHelper(不使用反射)

时间:2018-08-24 23:15:45

标签: razor asp.net-core

我正在尝试创建一个表标签助手,该助手可以自动解析给定模型中的列和行。

这是应该的(理论上是使用):

<table for="@Model">

</table>

,这应该自动显示列名和行。

自从我传递模型以来,生成列名并不困难

[HtmlTargetElement("table", Attributes = "for")]
public class DataTableTagHelper :TagHelper
{
    [HtmlAttributeName("for")]
    public ModelExpression For { get; set; }

    public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
    {
        foreach (var item in For.Metadata.ElementMetadata.Properties)
        {
            // generate html for theader using item.Name
        }
    }
}

但是获取模型的值并不容易。

是否可以获取这些属性的值?

我试图避免反射,因为我不认为通过每个请求进行反射都可以生成HTML代码。

1 个答案:

答案 0 :(得分:3)

我们通过将模型传递给属性的PropertyGetter来获得属性的值。

public override void Process(TagHelperContext context, TagHelperOutput output)
{
    foreach (var prop in For.Metadata.Properties)
    {
        var propertyName = prop.Name;
        var propertyValue = prop.PropertyGetter(For.Model);
    }

    return Task.CompletedTask;
}

如果模型实现了IEnumerable,那么我们需要将每个项目传递给其PropertyGetter

public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
    foreach (var item in For.Model as IEnumerable)
    {
        foreach (var prop in For.Metadata.ElementMetadata.Properties)
        {
            var name = prop.Name;
            var value = prop.PropertyGetter(item);
        }
    }

    return Task.CompletedTask;
}