繁体   English   中英

在 ASP.NET Razor 中动态访问属性

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM