EditorForModel 不呈现 ICollection 属性
本文关键字:ICollection 属性 EditorForModel | 更新日期: 2023-09-27 18:36:59
我正在一个属性类型为 ICollection<int>
的类上使用EditorForModel
帮助程序,不幸的是,我无法在我的页面中看到我的控件呈现。
下面是示例:
模型视图对象
public class CopyFromVM
{
[UIHint("MultiEntityList")]
public ICollection<int> EntityIds { get; set; }
...
}
在 EditorTemplate 文件夹中,我有文件 MultiEntityList.cshtml
@model ICollection<int>
<select name="@ViewData.ModelMetadata.PropertyName" id="@ViewData.ModelMetadata.PropertyName" multiple="multiple" >
...
</select>
当表单呈现时,我没有任何类型的错误。这些属性只是从渲染中被忽略。 所以我怀疑EditorForModel
忽略了复杂类型。查看网络,它应该适用于所有类型。
感谢您的帮助。
以下内容应从主视图中选取自定义模板:
@model CopyFromVM
@Html.EditorFor(x => x.EntityIds)
以下情况不会:
@model CopyFromVM
@Html.EditorForModel()
这是因为框架不会递归到复杂的对象属性中。您可以修改 Brad Wilson 在这篇博文中所解释的Object.cshtml
默认编辑器模板(查看他文章末尾的浅潜与深潜部分)。
还要确保您的编辑器模板放置在正确的文件夹中:~/Views/Shared/EditorTemplates/MultiEntityList.cshtml
而不是EditorTemplate
如您的问题中所述(请注意缺少s
)。
作为旁注,在编辑器模板中生成选择列表的名称和 id 属性的方式不正确,因为您没有考虑嵌套级别。例如,假设CopyFromVM
被用作另一个父视图模型的属性。在这种情况下,选择的名称将是错误的,默认模型绑定程序将无法解除冻结值: 请改用以下内容:
@model ICollection<int>
<select name="@ViewData.TemplateInfo.GetFullHtmlFieldName("")" id="@ViewData.TemplateInfo.GetFullHtmlFieldId("")" multiple="multiple" >
...
</select>
好吧,实际上,不,您已经有帮手为您完成这项工作@Html.ListBox
.在 ASP.NET MVC 视图中硬编码 HTML 表单元素似乎是一个非常脆弱的过程,我建议您避免。
还有另一个侧面评论:为了生成选择列表,您通常需要视图模型上的 2 个属性:一个将保存所选值,另一个将保存所有值。恕我直言,强烈键入编辑器模板以ICollection<int>
是错误的方法。