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

Net Core Razor中如何通过反射动态调用DisplayFor渲染指定属性列

解决方案

方案1:直接反射取值(最简实现)

如果不需要用到DisplayFor关联的特性(比如DisplayAttribute、自定义显示模板),直接通过反射取当前行对象的对应属性值即可,代码如下:

@foreach (var item in Model)
{
   <tr>
      @foreach(string c in ViewBag.columns as List<string>)
      {
            var prop = item.GetType().GetProperty(c);
            var value = prop?.GetValue(item)?.ToString();
            <td>@value</td>
      }
   </tr>
}

方案2:正确构造动态Lambda使用DisplayFor

你之前构造表达式的逻辑存在参数类型、表达式结构错误:表达式入参类型错设为了集合类型IEnumerable<myclass>,但此处需要的是单个myclass行对象的表达式。修正后的代码如下:

@using System.Linq.Expressions
@foreach (var item in Model)
{
   <tr>
      @foreach(string c in ViewBag.columns as List<string>)
      {
          // 构造表达式入参:类型为单条数据的myclass类型
          ParameterExpression parameter = Expression.Parameter(typeof(myclass), "x");
          // 构造属性访问逻辑:x.属性名
          MemberExpression propertyAccess = Expression.Property(parameter, c);
          // 生成完整Lambda表达式 x => x.属性名
          LambdaExpression lambda = Expression.Lambda(propertyAccess, parameter);
          // 转dynamic匹配DisplayFor的泛型重载
          <td>@Html.DisplayFor(lambda as dynamic)</td>
      }
   </tr>
}

方案3:使用Html.Display重载(无需手动构造表达式)

你之前调用Html.Display时参数顺序错误,使用官方内置的expression + model重载即可直接实现需求,无需手动构造表达式:

@foreach (var item in Model)
{
   <tr>
      @foreach(string c in ViewBag.columns as List<string>)
      {
            <td>@Html.Display(c, model: item)</td>
      }
   </tr>
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 16:45:01