Razor 我的ViewModel中的IEnumerable不与EditorForModel一起显示 视图模型 解决方案 查看_Formulario.cshtml SelectListItem.cshtml 后果

Razor 我的ViewModel中的IEnumerable不与EditorForModel一起显示 视图模型 解决方案 查看_Formulario.cshtml SelectListItem.cshtml 后果,razor,asp.net-mvc-4,mvc-editor-templates,Razor,Asp.net Mvc 4,Mvc Editor Templates,完整图像: 笔记 我试图将属性设置为UIHint,但仍然没有显示任何内容! 问题 我做错了什么?在默认情况下,当您使用Html.EditorForModel时,不要指望它会递归到复杂的属性,例如IEnumerable类型的Tipos属性。布拉德·威尔逊(Brad Wilson)在文章末尾更具体地阅读了《浅潜与深潜》一节中对此进行了解释。如果希望这样做,则需要为对象类型编写自定义编辑器模板 另一种可能是指定模板名称: @Html.EditorFor(x => x.Tipos, "Select

完整图像:

笔记 我试图将属性设置为UIHint,但仍然没有显示任何内容! 问题 我做错了什么?

在默认情况下,当您使用Html.EditorForModel时,不要指望它会递归到复杂的属性,例如IEnumerable类型的Tipos属性。布拉德·威尔逊(Brad Wilson)在文章末尾更具体地阅读了《浅潜与深潜》一节中对此进行了解释。如果希望这样做,则需要为对象类型编写自定义编辑器模板

另一种可能是指定模板名称:

@Html.EditorFor(x => x.Tipos, "SelectListItem")
还要记住,SelectListItem的编辑器模板是错误的,因为您将DropDownListFor作为第一个参数绑定到模型。不要忘记,此助手的第一个参数必须是用于保存选定值的标量属性。为此,在视图模型上需要一个字符串或整数属性。第二个参数表示集合

关于编辑器模板的另一个重要方面是,当您有一个IEnumerable类型的属性和一个名为T.cshtml的编辑器模板时,该编辑器模板必须是强类型的T类,而不是像您使用SelectListItem.cshtml模板那样的IEnumerable。如果使用UIHint或将模板名称指定为EditorFor帮助程序的第二个参数,则这不适用。在这种情况下,模板将被键入到集合中

总而言之,您可以实现Brad Wilson建议的自定义对象编辑器模板,该模板将递归到复杂属性,或者您可以修改_Formulario.cshtml视图,为每个单独的元素指定编辑器。

默认情况下,当您使用Html.EditorForModel时,不要期望它递归到复杂属性,例如Tipos属性,其类型为IEnumerable。布拉德·威尔逊(Brad Wilson)在文章末尾更具体地阅读了《浅潜与深潜》一节中对此进行了解释。如果希望这样做,则需要为对象类型编写自定义编辑器模板

另一种可能是指定模板名称:

@Html.EditorFor(x => x.Tipos, "SelectListItem")
还要记住,SelectListItem的编辑器模板是错误的,因为您将DropDownListFor作为第一个参数绑定到模型。不要忘记,此助手的第一个参数必须是用于保存选定值的标量属性。为此,在视图模型上需要一个字符串或整数属性。第二个参数表示集合

关于编辑器模板的另一个重要方面是,当您有一个IEnumerable类型的属性和一个名为T.cshtml的编辑器模板时,该编辑器模板必须是强类型的T类,而不是像您使用SelectListItem.cshtml模板那样的IEnumerable。如果使用UIHint或将模板名称指定为EditorFor帮助程序的第二个参数,则这不适用。在这种情况下,模板将被键入到集合中

总而言之,您可以按照Brad Wilson的建议实现一个自定义对象编辑器模板,该模板将递归到复杂的属性,或者您可以修改_Formulario.cshtml视图,为每个单独的元素指定编辑器。

a@foreach循环呈现正确的内容,但是结果标记对于每一行的控件将具有相同的id。它也不会将可枚举集合与模型实例一起发回

有两种方法可以实现这一点,即为集合中的每个项目提供唯一的id,并在回发时为集合添加水分:

一,。使用默认编辑器模板,而不是命名的模板

二,。使用@for循环,而不是@foreach:

这也不会:

@foreach(var item in parentObject.Items) {
    // this will render, but won't post the collection items back with the model instance: 
    @Html.EditorFor(c => item, "MyEditorTemplate") 
}
要详细了解原因,请查看以下问题:

A@foreach循环呈现看起来正确的内容,但生成的标记对于每一行的控件具有相同的id。它也不会将可枚举集合与模型实例一起发回

有两种方法可以实现这一点,即为集合中的每个项目提供唯一的id,并在回发时为集合添加水分:

一,。使用默认编辑器模板,而不是命名的模板

二,。使用@for循环,而不是@foreach:

这也不会:

@foreach(var item in parentObject.Items) {
    // this will render, but won't post the collection items back with the model instance: 
    @Html.EditorFor(c => item, "MyEditorTemplate") 
}

要详细了解原因,请查看以下问题:

谢谢你的解释。。我不会对每个属性都这样做,我至少会使用UIHint属性进行修改。问题是,即使我添加了UIHint,也没有发生任何事情@Riderman de Sousa Barbosa,没有发生任何事情,因为正如我所说,在默认对象模板中,ASP.NET MVC不会递归到复杂的属性。因此,即使您在Tipos属性上添加UIHint,它也将被忽略。你需要修改默认的Object.cshtml模板,正如Brad Wilson所示。我知道了。我本想避免这样,但是
我必须这样做。谢谢你的帮助@Darin,这里有一个额外的问题:如果默认情况下T需要T.cshtml模板名,那么没有[UIHint]的IEnumerable的默认模板名是什么?我尝试了Ts.cshtml,一个复数名,但是没有[UIHint]就无法工作。@callmelan,IEnumerable的默认模板是T.cshtml,强类型为T。ASP.NET MVC将自动为集合的每个元素调用它。感谢您的解释。。我不会对每个属性都这样做,我至少会使用UIHint属性进行修改。问题是,即使我添加了UIHint,也没有发生任何事情@Riderman de Sousa Barbosa,没有发生任何事情,因为正如我所说,在默认对象模板中,ASP.NET MVC不会递归到复杂的属性。因此,即使您在Tipos属性上添加UIHint,它也将被忽略。你需要修改默认的Object.cshtml模板,正如Brad Wilson所示。我知道了。嗯,我想避免这种情况,但我必须这样做。谢谢你的帮助@Darin,这里有一个额外的问题:如果默认情况下T需要T.cshtml模板名,那么没有[UIHint]的IEnumerable的默认模板名是什么?我尝试了Ts.cshtml,一个复数名,但是没有[UIHint]就无法工作。@callmelan,IEnumerable的默认模板是T.cshtml,强类型为T。ASP.NET MVC将为集合的每个元素自动调用它。
// editor name parameter must be omitted; default editor template's model type
// should be a single instance of the child object, not an IEnumerable. This 
// convention looks wrong, but it fully works:
@Html.EditorFor(parentObject => parentObject.Items) 
@for (int i = 0; i < parentObject.Items.Count ; i++) {
    // the model binder uses the indexer to disambiguate the collection items' controls: 
    @Html.EditorFor(c => Model.Items[i], "MyEditorTemplate") 
}
// this will error out; the model type will not match the view's at runtime:
@Html.EditorFor(parentObject => parentObject.Items, "MyEditorTemplate")
@foreach(var item in parentObject.Items) {
    // this will render, but won't post the collection items back with the model instance: 
    @Html.EditorFor(c => item, "MyEditorTemplate") 
}