0

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

谢谢您的帮助。

4

1 回答 1

2

以下应该从您的主视图中选择自定义模板:

@model CopyFromVM
@Html.EditorFor(x => x.EntityIds)

以下不会:

@model CopyFromVM
@Html.EditorForModel()

原因是框架不会递归到复杂的对象属性中。Object.cshtml您可以按照 Brad Wilson 在此博客文章中的说明修改默认编辑器模板(查看他的文章末尾的Shallow Dive 与 Deep Dive部分)。

还要确保您的编辑器模板放置在正确的文件夹中:~/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>是恕我直言,这是一种错误的方法。

于 2012-06-13T15:21:22.623 回答