ASP.NET Core Razor视图如何通过变量动态绑定Model属性值
问题原因
asp-for 是编译时标签助手,仅支持强类型的属性表达式,不支持运行时动态传入的属性名字符串,你直接把字符串变量colVal传给asp-for,它只会直接渲染变量的字符串值,不会动态查找Item对象的对应属性,这是问题的核心原因。
另外你原代码还有两处笔误:tbody循环变量定义为cust但实际用了col,columns变量没有声明,应该是从ViewData中取出的colList,同时tbody外层缺少Item集合的循环,表格结构不完整。
解决方法
方案1:手动构造input标签(推荐,实现简单)
通过反射读取Item对应属性的值,手动构造input的核心属性即可,不需要依赖asp-for:
@model IEnumerable<Project.Models.Item> @using System.Reflection @using Project.Models @{ var colList = (List<Columns>)ViewData["colList"]; // 提前缓存Item类型的属性信息,避免重复反射损耗性能 var itemType = typeof(Item); var propCache = itemType.GetProperties(BindingFlags.Public | BindingFlags.Instance); } <table> <thead> <tr> @foreach (var col in colList) { <th>@col.ColumnName</th> } </tr> </thead> <tbody> <!-- 外层循环Item集合,每一行对应一个Item对象 --> @foreach (var item in Model.Select((val, idx) => new { Value = val, Index = idx })) { <tr> @foreach (var col in colList) { // 反射读取对应属性的实际值 var propValue = propCache.First(p => p.Name == col.ColumnID).GetValue(item.Value)?.ToString(); <td> <!-- name属性遵循ASP.NET Core集合绑定规则,提交表单时可自动绑定到后端List<Item>参数 --> <input name="[@item.Index].@col.ColumnID" value="@propValue" id="@($"[{item.Index}]_{col.ColumnID}")" /> </td> } </tr> } </tbody> </table>
如果不需要提交表单仅做展示,可以省略name和id属性,只保留value即可。
方案2:自定义扩展方法复用逻辑(适合多处使用的场景)
如果多个页面都有动态绑定的需求,可以封装HtmlHelper扩展方法,内部构造表达式树调用原生InputFor:
// 放在项目Extensions目录下 using Microsoft.AspNetCore.Mvc.Rendering; using System.Linq.Expressions; public static class DynamicInputExtensions { public static IHtmlContent DynamicInputFor<TModel>(this IHtmlHelper<TModel> html, string propName, object propValue) { var param = Expression.Parameter(typeof(TModel), "x"); var propAccess = Expression.Property(param, propName); var lambda = Expression.Lambda<Func<TModel, string>>(propAccess, param); return html.InputFor(lambda, new { @value = propValue }); } }
视图中直接调用即可:
@foreach (var col in colList) { var propValue = propCache.First(p => p.Name == col.ColumnID).GetValue(item.Value)?.ToString(); <td> @Html.DynamicInputFor(col.ColumnID, propValue) </td> }
注意事项
- 反射有一定性能损耗,如果数据量很大,建议提前维护
ColumnID到属性信息的映射字典,不要每次循环都执行First查找 - 提交表单时必须保证input的
name属性格式为[索引].属性名,否则后端无法自动绑定到集合模型
内容的提问来源于stack exchange,提问作者Gokul Kannan
相关产品推荐
相关产品推荐

