部分vs显示模板与编辑器模板

所以,标题应该说明问题。

要在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”呈现,而部分将具有“的ElementName“)。

  • 更健壮的,例如,如果您的ViewModel中有List<T> ,您可以使用@Html.DisplayFor(model => model.CollectionOfFoo) ,并且MVC足够聪明,可以看到它是一个集合并呈现出单个显示为每个项目(而不是一个部分,这将需要一个明确的循环)。

  • 我也听说DisplayFor呈现一个“只读”模板,但我不明白 - 我不能在那里扔表吗?

    有人能告诉我其他一些原因吗? 比较三个地方是否有列表/文章?


    EditorFor vs DisplayFor很简单。 这些方法的语义是生成编辑/插入和显示/只读视图(分别)。 显示数据时使用DisplayFor (即生成包含模型值的div和span)。 编辑/插入数据时使用EditorFor (即在表单中生成输入标签时)。

    以上方法是以模型为中心的。 这意味着他们会考虑模型元数据(例如,您可以使用[UIHintAttribute][DisplayAttribute]注释您的模型类,这会影响选择哪个模板来为模型生成UI,它们通常也用于数据模型(即代表数据库中的行的模型等)

    另一方面, Partial以视图为中心,因为您主要关心的是选择正确的局部视图。 该视图不一定需要模型才能正常工作。 它可以拥有一套通用的标记,可在整个网站中重复使用。 当然,通常情况下,您希望影响此部分的行为,在这种情况下,您可能想要在适当的视图模型中传递该行为。

    你没有问过@Html.Action ,这里也值得一提。 您可以将其视为Partial的更强大版本,因为它执行控制器子操作,然后呈现视图(通常为局部视图)。 这很重要,因为子操作可以执行不属于局部视图的其他业务逻辑。 例如,它可以代表购物车组件。 使用它的原因是为了避免在应用程序中的每个控制器中执行与购物车相关的工作。

    最终选择取决于您在应用程序中建模的是什么。 另外请记住,你可以混合搭配。 例如,你可以有一个调用EditorFor helper的局部视图。 这实际上取决于你的应用程序是什么以及如何分解它以鼓励最大程度地重用代码,同时避免重复。


    您当然可以自定义DisplayFor以显示可编辑的表单。 但是这个约定是DisplayForreadonlyEditorFor是为了编辑。 坚持约定将确保无论您传入DisplayFor ,它都会执行相同类型的操作。


    为了让我的2c值得,我们的项目使用了几个jQuery选项卡的局部视图,并且每个选项卡使用其自己的局部视图呈现其字段。 这工作得很好,直到我们添加了一些功能,其中一些选项卡共享了一些常用字段。 我们的第一个方法是使用这些常用字段创建另一个局部视图,但使用EditorFor和DropDownListFor呈现字段和下拉列表时,这会变得非常笨重。 为了获得唯一的ID和名称,我们必须根据呈现它的父部分视图来使用前缀来显示字段:

        <div id="div-@(idPrefix)2" class="toHide-@(idPrefix)" style="display:none">
        <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>
    </div>
    

    这非常丑陋,所以我们决定使用编辑器模板,而这样做更清晰。 我们添加了一个带有常用字段的新视图模型,添加了匹配的编辑器模板,并使用来自不同父视图的编辑器模板呈现字段。 编辑器模板正确地呈现ID和名称。

    因此,简而言之,我们使用Editor Templates的一个令人信服的理由是需要在多个选项卡中呈现一些通用字段。 部分视图不是为此设计的,但编辑器模板完美地处理场景。

    链接地址: http://www.djcxy.com/p/30181.html

    上一篇: Partial vs Display Template vs Editor Template

    下一篇: asp.net MVC partial view controller action