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

标签 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 代码虽然对每个请求进行反射是一个好主意。

最佳答案

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

关于razor - IEnumerable 模型的表 TagHelper(不使用反射),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52012736/

相关文章:

c# - 如何终止 MVC4 中的 Razor 语句?

c# - 访问 ASP.NET Core 中的配置选项 : options pattern

c# - 当请求模型实际上无效时,ModelState 有效

c# - 为什么我看不到对象的详细信息(ID、名称等)。我正在使用 mvc 4、razor、 Entity Framework

asp.net - 如何将 ASP.NET Core Web 应用程序部署到 Azure B2C 租户?

c# - ASP.NET Core Razor 页面值不能为空

asp.net - 如何将范围服务注入(inject)到 IClaimsTransformer 的实现中?

javascript - 使用 Razor 维护 @section 标记内的 Javascript 代码突出显示

javascript - 在 MVC Razor 的 Javascript 中,用模型中的值替换关键字

c# - 如何将 Umbraco 项目插入 cshtml 文件中的 url,razor?