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

无法在ASP.NET MVC Core编辑器模板中访问自定义属性值

解决思路:获取动态模型属性的自定义ColumnAttribute

嘿,我明白你遇到的问题了——当使用dynamic模型时,ViewData.ModelMetadata.ContainerType确实会是空的,因为动态类型的元数据信息没办法被MVC正确解析出来。不过有两个靠谱的办法能搞定这个事儿:

方法一:改用非动态模型类型(推荐)

如果你的场景允许,把模板的模型从dynamic改成object或者具体的模型类,这样ContainerType就能正常获取到了。修改后的模板代码大概是这样:

@model object
@foreach (var prop in ViewData.ModelMetadata.Properties)
{
    if (prop.TemplateHint == "HiddenInput")
    {
        @Html.Hidden(prop.PropertyName)
    }
    else
    {
        var member = ViewData.ModelMetadata.ContainerType.GetMember(prop.PropertyName).FirstOrDefault();
        var columnAttr = member?.GetCustomAttribute<ColumnAttribute>();
        var columnClass = columnAttr?.Class ?? "";

        <div class="@columnClass">
            @Html.Editor(prop.PropertyName)
        </div>
    }
}

这种方式更符合MVC的元数据设计逻辑,稳定性更高。

方法二:通过PropertyDescriptor获取自定义属性(兼容dynamic)

如果必须保留dynamic模型,那可以利用ModelMetadata里的PropertyDescriptor属性,它直接关联了属性的描述信息,包含所有自定义特性。代码调整如下:

@model dynamic
@using System.Linq // 记得引用Linq命名空间

@foreach (var prop in ViewData.ModelMetadata.Properties)
{
    if (prop.TemplateHint == "HiddenInput")
    {
        @Html.Hidden(prop.PropertyName)
    }
    else
    {
        // 从PropertyDescriptor中提取ColumnAttribute
        var columnAttr = prop.PropertyDescriptor?.GetAttributes()
            .OfType<ColumnAttribute>()
            .FirstOrDefault();
        
        var columnClass = columnAttr?.Class ?? ""; // 没有属性时用空类

        <div class="@columnClass">
            @Html.Editor(prop.PropertyName)
        </div>
    }
}

这个方法的核心是PropertyDescriptor,它不受动态类型的影响,只要属性存在,就能拿到它身上标记的所有自定义特性。

你可以根据自己的实际场景选其中一种试试,应该就能解决ContainerType为null的问题,顺利获取到ColumnAttribute的Class值啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:13:48