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
相关产品推荐
相关产品推荐

