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

