EditorForModel不呈现ICollection属性

时间:2012-06-13 15:14:56

标签: c# asp.net-mvc-3 razor

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

感谢您的帮助。

1 个答案:

答案 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>是恕我直言,这是一种错误的方法。