[英]Dynamically Access Properties in ASP.NET Razor
生成 HTML 表时,我试图在 ASP.NET Razor 中动态访问类的属性。 这个问题通常可以通过反射轻松解决,但@Html.DisplayFor
方法给我带来了问题。
我试图生成一个 HTML 表格,每行有 3 个单元格,项目的标题以粗体显示为单元格的第一行,项目的值位于单元格的第二行。 表格的内容不应包含“排除字段”列表中的单元格,而且我不想静态引用每一列。
<table class="blpSecurityTable">
<tr>
@{
int _rowCount = 0;
foreach (var property in item.GetType().GetProperties())
{
@if (!Model.ExcludedFields.Contains(@property.Name))
{
dynamic test = @property.GetValue(item);
<td><b>@Html.DisplayFor(m => @property.Name)</b><br />@Html.DisplayFor(m => @test)</td>
_rowCount++;
}
@if (_rowCount % numCols == 0)
{
@:</tr><tr>
}
}
}
</tr>
</table>
我试过调用@Html.DisplayFor(m => @property.GetValue(item))
但这只会产生运行时错误。 我可以简单地调用@property.GetValue(item)
并显示值,但这并不理想,因为我使用显示模板来执行诸如将日期设置为 ShortDateString 格式的操作。
我知道 DisplayFor 正在使用反射来确定属性的类型,这就是为什么我尝试使用动态变量来促进该方法的反射。 但是,当我运行该方法时,它会引发错误,表明该变量不是通用参数,因此无法共享其属性。 结果页面大部分为空白值,有些单元格填充了意外的描述信息。
感觉快到了,但是不知道怎么办。 如果我不将值传递给 HTML 显示方法,页面将不会看起来正确,而且我想不出任何其他方法来获取我想要生成的表的类型。 想法?
该问题通过为 Security 对象创建一个显示模板来解决,然后我可以正确使用 @Html.Display 方法,因为显示模板的模型具有该属性的条目。
这是页面代码现在的样子:
@model Interface.Models.Security
@{int numCols = 3;}
<table class="blpSecurityTable">
<tr>
@{
int _rowCount = 0;
foreach (var property in Model.GetType().GetProperties())
{
@if (!BLPDLModel.ExcludedFields.Contains(@property.Name))
{
<td><b>@Html.DisplayFor(m => @property.Name)</b><br />@Html.Display(property.Name)</td>
_rowCount++;
}
@if (_rowCount % numCols == 0)
{
@:</tr><tr>
}
}
}
</tr>
</table>
@foreach (var item in Model.Security)
{
<div class="blpSecurityItem">
<button type="button" class="collapsible">{button text}</button>
@{
<div class="collapsible-content">
<hr />
@Html.DisplayFor(m => item)
</div>
}
</div>
将@Html.DisplayFor(m => @test)
替换为@Html.Display(property.Name)
并且你的日期模型属性应该有[DisplayFormat(DataFormatString = "{0:yyyy/MM/dd}")]
或任何你喜欢的
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.