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

Razor IEnumerable模型的表TagHelper(不使用反射),razor,asp.net-core,Razor,Asp.net Core,我正在尝试创建一个表标记帮助器,它可以自动解析给定模型中的列和行 这就是它应该如何(理论上使用): 但是获取模型的值并不是那么容易 有没有办法获得这些属性的值 我试图避免反射,因为我不认为通过对每个请求进行反射来生成HTML代码是一个好主意。我们通过将模型传递给属性的PropertyGetter来获得属性的值 public override void Process(TagHelperContext context, TagHelperOutput output) { foreach (

我正在尝试创建一个表标记帮助器,它可以自动解析给定模型中的列和行

这就是它应该如何(理论上使用):

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

有没有办法获得这些属性的值


我试图避免反射,因为我不认为通过对每个请求进行反射来生成HTML代码是一个好主意。

我们通过将模型传递给属性的
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;
}
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;
}
如果模型实现了
IEnumerable
,那么我们需要将每个项传递给它的
属性getter

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

感谢您的帮助,但我不是在尝试获取ElementMetadata的值,ElementMetadata是列表中对象的类型(for.Metadata.ElementMetadata.Properties),而不是for.Metadata.Properties。使用您的代码的属性正在触发强制转换异常是的,这正是我解决此问题的方法(取决于您的第一个答案),不过有一个小版本,TagHelpers不支持泛型,此时无法知道类型,因此只需将您的答案编辑为IEnumerable(非泛型接口),其他一切都很好,我将接受您的答案;)你的型号是什么?你能发布你的模型的类吗?它应该是表的通用类,所以任何实现IEnumrable的东西,我都在删除模型的属性,所以你可以假设IEnumrable就是模型,我在循环一些类的所有属性,让我看看我是否理解。您的
模型
实现了
IEnumerable
。是这样吗?正确,并且其中的类是呈现的HTML表的所有内容,您希望列名来自
属性名吗?