C# 为什么在MVC 4.5+中使用EditorFor over PartialView渲染局部视图;

C# 为什么在MVC 4.5+中使用EditorFor over PartialView渲染局部视图;,c#,asp.net,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,我使用的是ASP.NET MVC 4.5+,我试图理解为什么要使用Html.EditorFor而不是Html.PartialView来呈现局部视图 我发现EditorFor“尊重模型层次结构”,我认为这意味着,对于EditorFor呈现的视图中的输入,输入名称/ID反映调用模型的嵌套级别,而PartialView不这样做 但是,在以下局部视图中: @model someModel ... @Html.TextboxFor(m => m.complexObject.property) ...

我使用的是ASP.NET MVC 4.5+,我试图理解为什么要使用Html.EditorFor而不是Html.PartialView来呈现局部视图

我发现EditorFor“尊重模型层次结构”,我认为这意味着,对于EditorFor呈现的视图中的输入,输入名称/ID反映调用模型的嵌套级别,而PartialView不这样做

但是,在以下局部视图中:

@model someModel
...
@Html.TextboxFor(m => m.complexObject.property)
...
将文本框渲染为

<input id="complexObject_property" name="complexObject.property" ... >

当通过Html.PartialView呈现时,至少在MVC4.5+中。在我看来,这很好地尊重了模型层次结构

我知道DisplayFor和EditorFor将告诉框架自动查看~/*Templates文件夹,以返回这些控件调用的视图的视图。因此,目前我唯一能想到的是,我们将使用Display/EditorFor来允许这种文件/文件夹结构&自动逻辑渲染,这比在“共享”文件夹中查找特定命名的部分更具语义


目前,即使是Microsoft的文档也似乎暗示Html.EditorFor仅用于呈现单个输入,而不是视图:

假设您有一个模型,如下所示:

public class ExampleModel
{
    public int ID { get; set; }
    public string Name { get; set; }
}
此外,假设您在/Shared中的EditorTemplates文件夹中有一个名为ExampleModel.cshtml的视图:

@model ExampleModel

@Html.LabelFor(m => m.Name)
@Html.TextBoxFor(m => m.Name)
@Html.HiddenFor(m => m.ID)
为了继续我们的假设,假设您也有此模型:

public class ExampleListModel
{
    public ICollection<ExampleModel> Examples { get; set; }
}
Razor引擎将查找(并在本例中查找)与“item”类(在我的示例中为ExampleModel)名称匹配的视图。当它这样做时,它将遍历集合,为ExampleListModel.Examples中的每个项生成一行。作为一个副作用,它还以这样的方式命名控件:集合可以以默认模型绑定器理解的方式发布到控制器。因此,生成的标记可能如下所示

<label for="Examples[0].Name">Name</label>
<input id="Examples[0].Name" name="Examples_0__Name" value="Fee" />
<input id="Examples[0].ID" name="Examples_0__ID" value="1" />

<label for="Examples[1].Name">Name</label>
<input id="Examples[1].Name" name="Examples_1__Name" value="Fi" />
<input id="Examples[1].ID" name="Examples_1__ID" value="2" />

<label for="Examples[2].Name">Name</label>
<input id="Examples[2].Name" name="Examples_2__Name" value="Fo" />
<input id="Examples[2].ID" name="Examples_2__ID" value="3" />
名称
名称
名称

依此类推,索引相应增加。

您指定的完全限定名-
m=>m.complexObject.property
当然会生成
name=“complexObject.property”
EditorFor()
并非仅用于单个输入。事实上,更常用于复杂对象和集合来为复杂模型生成正确的名称属性。使用partials通常意味着必须将前缀传递给partial,因为我很感激这个答案,谢谢。非常清楚和不含糊的例子。
<label for="Examples[0].Name">Name</label>
<input id="Examples[0].Name" name="Examples_0__Name" value="Fee" />
<input id="Examples[0].ID" name="Examples_0__ID" value="1" />

<label for="Examples[1].Name">Name</label>
<input id="Examples[1].Name" name="Examples_1__Name" value="Fi" />
<input id="Examples[1].ID" name="Examples_1__ID" value="2" />

<label for="Examples[2].Name">Name</label>
<input id="Examples[2].Name" name="Examples_2__Name" value="Fo" />
<input id="Examples[2].ID" name="Examples_2__ID" value="3" />