为什么使用EditorFor over Partial View在MVC 4.5+中呈现局部视图

时间:2015-04-16 15:05:25

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我正在使用ASP.NET MVC 4.5+,我试图理解为什么人们想要使用Html.EditorFor而不是Html.PartialView渲染局部视图。

我发现EditorFor“尊重模型层次结构”,我收集到这意味着,对于EditorFor呈现的视图中的输入,输入名称/ ID反映了调用模型的嵌套级别,并且PartialViews不会这样做。

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

@model someModel
...
@Html.TextboxFor(m => m.complexObject.property)
...

将文本框呈现为

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

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

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

就目前而言,即使微软的文档似乎暗示Html.EditorFor仅用于呈现单个输入,而不是视图:https://msdn.microsoft.com/en-us/library/system.web.mvc.html.editorextensions.editorfor(v=vs.118).aspx

1 个答案:

答案 0 :(得分:9)

假设你有一个模型,如下:

public class ExampleModel
{
    public int ID { get; set; }
    public string Name { get; set; }
}

此外,假设您在EditorTemplates文件夹中有一个名为ExampleModel.cshtml的视图,位于/ Shared:

@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; }
}

通过ExampleListModel的视图,您可以执行以下操作:

@model ExampleListModel

@Html.EditorFor(m => m.Examples)

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" />

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