首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EditorForModel不呈现ICollection属性

EditorForModel不呈现ICollection属性
EN

Stack Overflow用户
提问于 2012-06-13 23:14:56
回答 1查看 288关注 0票数 0

我在一个具有ICollection<int>类型属性的类上使用EditorForModel帮助器,不幸的是我无法在页面中看到我的控件呈现。

示例如下:

模型视图对象

代码语言:javascript
复制
public class CopyFromVM
{

    [UIHint("MultiEntityList")]
    public ICollection<int> EntityIds { get; set; }
    ...
}

在EditorTemplate文件夹中,我有文件MultiEntityList.cshtml

代码语言:javascript
复制
@model ICollection<int>


<select name="@ViewData.ModelMetadata.PropertyName" id="@ViewData.ModelMetadata.PropertyName" multiple="multiple" >
 ...
</select>

当呈现表单时,我没有任何类型的错误。这些属性在渲染时被忽略了。所以我怀疑EditorForModel忽略了复杂类型。从网页上看,它应该适用于所有类型。

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-13 23:21:23

下面的代码将从您的主视图中选取自定义模板:

代码语言:javascript
复制
@model CopyFromVM
@Html.EditorFor(x => x.EntityIds)

以下内容不会:

代码语言:javascript
复制
@model CopyFromVM
@Html.EditorForModel()

这是因为框架不会递归到复杂的对象属性中。您可以按照Brad Wilson在this blog post中所解释的那样修改Object.cshtml默认编辑器模板(请查看他的帖子末尾的浅潜水与深潜水部分)。

还要确保您的编辑器模板放置在正确的文件夹中:~/Views/Shared/EditorTemplates/MultiEntityList.cshtml,而不是问题中所述的EditorTemplate (请注意缺少的s)。

顺便说一句,您在编辑器模板中生成选择列表的name和id属性的方式是不正确的,因为您没有考虑到嵌套级别。例如,假设CopyFromVM被用作另一个父视图模型的属性。在这种情况下,select的名称将是错误的,并且默认的模型绑定器将无法恢复该值:使用以下内容:

代码语言:javascript
复制
@model ICollection<int>
<select name="@ViewData.TemplateInfo.GetFullHtmlFieldName("")" id="@ViewData.TemplateInfo.GetFullHtmlFieldId("")" multiple="multiple" >
    ...
</select>

嗯,实际上,不,你已经有帮手为你做这项工作了,@Html.ListBox。在ASP.NET MVC视图中对HTML form元素进行硬编码似乎是一个相当脆弱的过程,我建议您避免这种过程。

还有另一个附注:为了生成选择列表,您通常需要视图模型上的两个属性:一个用于保存所选值,另一个用于保存所有值。因此,在ICollection<int>中强力键入编辑器模板是一种错误的方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11018040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档