【问题标题】:Why use EditorFor over PartialView to render a partial view in MVC 4.5+为什么在 MVC 4.5+ 中使用 EditorFor 而不是 PartialView 来渲染局部视图
【发布时间】:2015-06-23 02:24:22
【问题描述】:

我正在使用 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 来允许这种文件/文件夹结构和自动渲染,这比在“共享”文件夹中查找更具语义性专门命名为partial。

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

【问题讨论】:

  • 您指定完全限定名称 - m =&gt; m.complexObject.property 所以它当然会生成 name="complexObject.property"EditorFor() 并非仅用于单个输入。事实上,它更常用于复杂对象和集合,为复杂模型生成正确的名称属性。使用部分通常意味着必须按照this example 将前缀传递给部分

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的回答,谢谢。非常清晰且不含糊的示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多