所以,标题应该不言自明。
要在 ASP.NET MVC 中创建可重用的组件,我们有 3 个选项(可能是我没有提到的其他选项):
局部视图:
@Html.Partial(Model.Foo, "SomePartial")
自定义编辑器模板:
@Html.EditorFor(model => model.Foo)
自定义显示模板:
@Html.DisplayFor(model => model.Foo)
就实际的 View/HTML 而言,所有三个实现都是相同的:
@model WebApplications.Models.FooObject <!-- Bunch of HTML -->
所以,我的问题是 - 您何时/如何决定使用这三个中的哪一个?
我真正要寻找的是在创建问题之前要问自己的问题列表,这些问题的答案可用于决定使用哪个模板。
这是我发现使用 EditorFor/DisplayFor 更好的两件事:
他们在渲染 HTML 帮助器时尊重模型层次结构(例如,如果您的“Foo”模型上有一个“Bar”对象,“Bar”的 HTML 元素将使用“Foo.Bar.ElementName”渲染,而部分将具有“元素名称”)。
更健壮,例如,如果您List<T>的 ViewModel 中有 a of ,您可以使用@Html.DisplayFor(model => model.CollectionOfFoo),并且 MVC 足够聪明,可以看到它是一个集合并为每个项目呈现单个显示(而不是 Partial,这需要显式的 for环形)。
List<T>
@Html.DisplayFor(model => model.CollectionOfFoo)
我也听说 DisplayFor 呈现一个“只读”模板,但我不明白 - 我不能在那里扔一个表格吗?
有人可以告诉我其他一些原因吗?有没有比较这三者的列表/文章?
EditorForvsDisplayFor很简单。这些方法的语义是生成编辑/插入和显示/只读视图(分别)。在显示数据时使用DisplayFor(即当您生成包含模型值的 div 和 span 时)。在编辑/插入数据时使用EditorFor(即当您在表单中生成输入标签时)。
EditorFor
DisplayFor
上述方法都是以模型为中心的。这意味着他们将考虑模型元数据(例如,您可以使用[UIHintAttribute]or注释您的模型类,[DisplayAttribute]这将影响选择哪个模板来生成模型的 UI。它们通常也用于数据模型(即模型表示数据库中的行等)
[UIHintAttribute]
[DisplayAttribute]
另一方面Partial是以视图为中心,因为您最关心的是选择正确的局部视图。视图不一定需要模型才能正常运行。它可以只有一组通用的标记,可以在整个站点中重复使用。当然,很多时候你想要影响这个局部的行为,在这种情况下你可能想要传入一个适当的视图模型。
Partial
你没有问@Html.Action这里也值得一提。您可以将其视为更强大的版本,Partial因为它执行控制器子操作,然后呈现视图(通常是局部视图)。这很重要,因为子操作可以执行不属于局部视图的附加业务逻辑。例如,它可以表示购物车组件。使用它的原因是避免在应用程序的每个控制器中执行与购物车相关的工作。
@Html.Action
最终选择取决于您在应用程序中建模的是什么。还请记住,您可以混合搭配。例如,您可以有一个调用EditorFor助手的局部视图。这实际上取决于您的应用程序是什么以及如何将其分解以鼓励最大程度地重用代码,同时避免重复。