【问题标题】:Table TagHelper for an IEnumerable Model (without using Reflection)用于 IEnumerable 模型的 Table TagHelper(不使用反射)
【发布时间】:2018-08-24 23:15:45
【问题描述】:

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

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

<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 代码并不是一个好主意。

【问题讨论】:

  • 你的模型是什么类型的?你能发布你的模型的类吗?
  • 它应该是表通用的,所以任何实现 IEnumrable 的东西,我都会跳过模型的属性,所以你可以假设 IEnumrable 是模型,我正在循环SomeClass 的所有属性
  • 让我看看我是否明白。你的Model 实现IEnumerable。对吗?
  • 正确,里面的类是什么
  • 对于呈现的 HTML 表,是否希望列名来自 whatever 属性名?

标签: razor asp.net-core


【解决方案1】:

我们通过将模型传递给其属性的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;
}

【讨论】:

  • 感谢您的帮助,但不是我试图获取 ElementMetadata 的值,它是列表中对象的类型 (For.Metadata.ElementMetadata.Properties) 而不是 For.Metadata。使用您的代码的属性正在触发强制转换异常
  • 是的,这正是我解决它的方法(依赖于你的第一个答案),虽然有一个小版本,TagHelpers 不支持泛型并且此时无法知道类型,所以只需将您的答案编辑为 IEnumrable(非通用接口),其他一切都很好,我会接受您的答案;)
猜你喜欢
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
相关资源
最近更新 更多