ASP.NET MVC 3 - Partial vs Display Template vs Editor Template
所以,这个标题应该能说明问题。
要在ASP.NET MVC中创建可重用组件,我们有3个选项(可能是我没有提到的其他选项):
部分观点:
1 | @Html.Partial(Model.Foo,"SomePartial") |
自定义编辑器模板:
1 | @Html.EditorFor(model => model.Foo) |
自定义显示模板:
1 | @Html.DisplayFor(model => model.Foo) |
就实际视图/html而言,这三种实现都是相同的:
1 2 3 | @model WebApplications.Models.FooObject <!-- Bunch of HTML --> |
所以,我的问题是-你什么时候/如何决定使用三种方法中的哪一种?
我真正要找的是在创建问题之前要问自己的一系列问题,答案可以用来决定使用哪个模板。
以下是我在editor for/displayfor中发现的两件更好的事情:
在呈现HTML助手时,它们尊重模型层次结构(例如,如果"foo"模型上有"bar"对象,"bar"的HTML元素将以"foo.bar.elementname"呈现,而部分元素将以"elementname"呈现)。
更强大的功能,例如,如果您的ViewModel中有某个东西的
我也听说过Displayfor呈现"只读"模板,但我不明白这一点-我不能在上面扔一个表单吗?
有人能告诉我其他的原因吗?是否有比较这三个的列表/文章?
以上方法以模型为中心。这意味着它们将考虑模型元数据(例如,您可以用
另一方面,
你没有问过
最终,选择取决于您在应用程序中建模的内容。还要记住,你可以混搭。例如,您可以有一个局部视图来调用
您当然可以自定义
为了让我的2c值,我们的项目使用了一个带有几个jquery选项卡的局部视图,并且每个选项卡都用自己的局部视图呈现其字段。这很好地工作,直到我们添加了一个特性,其中一些选项卡共享一些公共字段。我们的第一个方法是用这些公共字段创建另一个局部视图,但是当使用editorfor和dropDownListfor呈现字段和下拉列表时,这变得非常笨拙。为了获得唯一的ID和名称,我们必须根据呈现字段的父部分视图使用前缀呈现字段:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <fieldset> <label for="@(idPrefix).Frequency">Frequency<span style="color: #660000;"> *</span></label> <input name="@(idPrefix).Frequency" id="@(idPrefix)_Frequency" style="width: 50%;" type="text" value="@(defaultTimePoint.Frequency)" data-bind="value: viewState.@(viewStatePrefix).RecurringTimepoints.Frequency" data-val="true" data-val-required="The Frequency field is required." data-val-number="The field Frequency must be a number." data-val-range-min="1" data-val-range-max="24" data-val-range="The field Frequency must be between 1 and 24." data-val-ignore="true"/> @Html.ValidationMessage(idPrefix +".Frequency") ... etc </fieldset> |
这变得相当难看,所以我们决定使用编辑器模板,这样做更干净。我们添加了一个带有公共字段的新视图模型,添加了匹配的编辑器模板,并使用来自不同父视图的编辑器模板呈现了这些字段。编辑器模板正确地呈现ID和名称。
因此,简而言之,我们使用编辑器模板的一个令人信服的原因是需要在多个选项卡中呈现一些公共字段。部分视图不是为此设计的,但是编辑器模板可以完美地处理场景。
到目前为止还没有提到的另一个区别是,partialView不添加模型前缀,而模板添加模型前缀。这是问题所在
在下列情况下,使用
使用模板的原因: