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忽略了复杂类型。查看网络,它应该适用于所有类型。

感谢您的帮助。

EditorForModel 不呈现 ICollection 属性

以下内容应从主视图中选取自定义模板:

@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>是错误的方法。