You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core MVC:如何用Html.DisplayFor获取通用属性值及实现代码

ASP.NET Core MVC 动态属性显示问题解决方案

1. 用Html.DisplayFor获取通用属性值的方法

Html.DisplayFor 依赖表达式树解析模型元数据(比如[DisplayName]、[DisplayFormat]这类特性),直接传入PropertyInfo实例或属性值无法正确工作。要动态获取通用属性值,最简洁的方式是编写一个HtmlHelper扩展方法:

public static class HtmlHelperExtensions
{
    public static IHtmlContent DisplayForProperty<TModel>(this IHtmlHelper<TModel> htmlHelper, TModel model, PropertyInfo property)
    {
        // 构造表达式:model => (object)model.PropertyName
        var parameter = Expression.Parameter(typeof(TModel), "model");
        var propertyAccess = Expression.Property(parameter, property);
        var lambda = Expression.Lambda<Func<TModel, object>>(
            Expression.Convert(propertyAccess, typeof(object)), 
            parameter
        );
        return htmlHelper.DisplayFor(lambda);
    }
}

将这个类放在项目的Extensions文件夹中,在_ViewImports.cshtml添加命名空间引用(比如@using YourProjectNamespace.Extensions),确保视图能访问到该方法。

2. 实现动态遍历模型属性生成表格的正确代码

你原代码中@Html.DisplayFor(modelItem => itemValue)的问题在于,itemValue是PropertyInfo对象而非模型属性值,DisplayFor无法解析正确的模型元数据,最终会显示PropertyInfo的ToString结果而非属性实际值。结合上面的扩展方法,修改后的完整代码如下:

<table>
    @foreach (var itemRow in Model)
    {
        <tr>
            @foreach (var property in itemRow.GetType().GetProperties())
            {
                <td>
                    @Html.DisplayForProperty(itemRow, property)
                </td>
            }
        </tr>
    }
</table>

额外优化建议

如果需要过滤不需要显示的属性(比如导航属性、标记了[HiddenInput]的属性),可以在遍历属性时添加过滤条件:

itemRow.GetType().GetProperties()
    .Where(p => 
        // 排除标记隐藏输入的属性
        p.GetCustomAttribute<HiddenInputAttribute>() == null &&
        // 排除复杂类型(可根据需求调整)
        (!p.PropertyType.IsClass || p.PropertyType == typeof(string))
    )

内容的提问来源于stack exchange,提问作者user2809734

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 15:10:23