我在类EditorForModel
属性的类上使用ICollection<int>
帮助器,我不能在页面中看到我的控件渲染。
以下是样本:
模型视图对象
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
忽略了复杂的类型。查看网页,它应适用于所有类型。
感谢您的帮助。
答案 0 :(得分:2)
以下内容应从主视图中选择自定义模板:
@model CopyFromVM
@Html.EditorFor(x => x.EntityIds)
以下不会:
@model CopyFromVM
@Html.EditorForModel()
原因是因为框架没有递归到复杂的对象属性中。您可以修改Object.cshtml
默认编辑器模板,如Brad this blog post中所解释的那样(在帖子结尾处查看 Shallow Dive vs. Deep Dive 部分)。 / p>
另外,请确保将您的编辑器模板放入正确的文件夹中:~/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>
是恕我直言,这是一种错误的方法。