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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:06:04