我在一个具有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忽略了复杂类型。从网页上看,它应该适用于所有类型。
谢谢你的帮助。
发布于 2012-06-13 23:21:23
下面的代码将从您的主视图中选取自定义模板:
@model CopyFromVM
@Html.EditorFor(x => x.EntityIds)以下内容不会:
@model CopyFromVM
@Html.EditorForModel()这是因为框架不会递归到复杂的对象属性中。您可以按照Brad Wilson在this blog post中所解释的那样修改Object.cshtml默认编辑器模板(请查看他的帖子末尾的浅潜水与深潜水部分)。
还要确保您的编辑器模板放置在正确的文件夹中:~/Views/Shared/EditorTemplates/MultiEntityList.cshtml,而不是问题中所述的EditorTemplate (请注意缺少的s)。
顺便说一句,您在编辑器模板中生成选择列表的name和id属性的方式是不正确的,因为您没有考虑到嵌套级别。例如,假设CopyFromVM被用作另一个父视图模型的属性。在这种情况下,select的名称将是错误的,并且默认的模型绑定器将无法恢复该值:使用以下内容:
@model ICollection<int>
<select name="@ViewData.TemplateInfo.GetFullHtmlFieldName("")" id="@ViewData.TemplateInfo.GetFullHtmlFieldId("")" multiple="multiple" >
...
</select>嗯,实际上,不,你已经有帮手为你做这项工作了,@Html.ListBox。在ASP.NET MVC视图中对HTML form元素进行硬编码似乎是一个相当脆弱的过程,我建议您避免这种过程。
还有另一个附注:为了生成选择列表,您通常需要视图模型上的两个属性:一个用于保存所选值,另一个用于保存所有值。因此,在ICollection<int>中强力键入编辑器模板是一种错误的方法。
https://stackoverflow.com/questions/11018040
复制相似问题