我正在尝试创建一个表标记助手,它可以自动解析给定模型中的列和行。
这是它应该如何(理论上使用):
<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/