ASP.NET MVC 3 - Частичный или шаблон отображения и шаблон редактора - PullRequest
301 голосов
/ 18 февраля 2011

Итак, название должно говорить само за себя.

Для создания повторно используемых компонентов в 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:

  1. Они уважают иерархии моделей при рендеринге помощников HTML (например, если у вас есть объект "Bar" в вашей модели "Foo", элементы HTML для "Bar" будут отображаться с "Foo.Bar.ElementName", в то время как часть будет иметь "ElementName").

  2. Более надежный, например, если у вас есть List<T> чего-то в вашей ViewModel, вы можете использовать @Html.DisplayFor(model => model.CollectionOfFoo), и MVC достаточно умен, чтобы видеть его коллекцию и отображать единое отображение для каждого элемента ( в отличие от частичного, который потребовал бы явного цикла for).

Я также слышал, что DisplayFor отображает шаблон "только для чтения", но я не понимаю этого - разве я не могу добавить туда форму?

Может кто-нибудь сказать мне другие причины? Есть ли где-нибудь список / статья, сравнивающая три?

Ответы [ 5 ]

297 голосов
/ 18 февраля 2011

EditorFor против DisplayFor просто. Семантика методов состоит в том, чтобы генерировать представления редактирования / вставки и отображения / только для чтения (соответственно). Используйте DisplayFor при отображении данных (т. Е. При создании элементов div и span, которые содержат значения модели). Используйте EditorFor при редактировании / вставке данных (т. Е. При создании входных тегов внутри формы).

Вышеуказанные методы ориентированы на модель. Это означает, что они будут учитывать метаданные модели (например, вы можете аннотировать класс вашей модели с помощью [UIHintAttribute] или [DisplayAttribute], и это будет влиять на то, какой шаблон будет выбран для создания пользовательского интерфейса для модели. Они также обычно используются для модели данных (т.е. модели, представляющие строки в базе данных и т. д.)

С другой стороны, Partial ориентирован на просмотр, так как вас больше всего интересует выбор правильного частичного вида. Представлению не обязательно нужна модель для правильного функционирования. У него может быть общий набор разметки, который повторно используется по всему сайту. Конечно, часто вы хотите повлиять на поведение этой части, и в этом случае вы можете захотеть передать соответствующую модель представления.

Вы не спрашивали о @Html.Action, который также заслуживает упоминания здесь. Вы могли бы думать о нем как о более мощной версии Partial, в которой он выполняет дочернее действие контроллера и затем отображает представление (которое обычно является частичным представлением). Это важно, потому что дочернее действие может выполнять дополнительную бизнес-логику, которая не принадлежит частичному представлению. Например, он может представлять компонент корзины покупок. Причиной его использования является недопущение выполнения работ, связанных с корзиной покупок, на каждом контроллере в вашем приложении.

В конечном итоге выбор зависит от того, что именно вы моделируете в своем приложении. Также помните, что вы можете смешивать и сочетать. Например, у вас может быть частичное представление, которое вызывает помощник EditorFor. Это действительно зависит от того, что представляет собой ваше приложение и как его учитывать, чтобы обеспечить максимальное повторное использование кода, избегая при этом повторения.

15 голосов
/ 18 февраля 2011

Вы, конечно, можете настроить DisplayFor для отображения редактируемой формы.Но соглашение для DisplayFor должно быть readonly и EditorFor для редактирования.Соблюдение соглашения гарантирует, что независимо от того, что вы передаете в DisplayFor, оно будет делать то же самое.

13 голосов
/ 21 февраля 2012

Просто для того, чтобы оценить мой 2c, наш проект использует частичное представление с несколькими вкладками jQuery, и каждая вкладка отображает свои поля со своим частичным представлением. Это работало нормально, пока мы не добавили функцию, благодаря которой некоторые вкладки имели общие поля. Наш первый подход к этому состоял в создании другого частичного представления с этими общими полями, но это стало очень неуклюжим при использовании EditorFor и DropDownListFor для визуализации полей и раскрывающихся списков. Чтобы получить уникальные идентификаторы и имена, мы должны были отобразить поля с префиксом в зависимости от родительского частичного представления, которое его отображало:

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

Это стало довольно уродливо, поэтому мы решили вместо этого использовать шаблоны шаблонов, которые работали намного чище. Мы добавили новую модель представления с общими полями, добавили соответствующий шаблон редактора и визуализировали поля с использованием шаблона редактора из разных родительских представлений. Шаблон редактора правильно отображает идентификаторы и имена.

Короче говоря, убедительной причиной использования шаблонов редактора была необходимость отображать некоторые общие поля на нескольких вкладках. Частичные представления не предназначены для этого, но шаблоны редактора отлично справляются со сценарием.

1 голос
/ 14 июня 2017

Еще одно отличие, которое не было упомянуто до сих пор, состоит в том, что частичное представление не добавляет префиксы модели, в то время как шаблон Здесь - это проблема

1 голос
/ 05 октября 2015

Использовать _partial просмотр подхода, если:

  1. Просмотр Centric Logic
  2. Что сохранить все _partial Просмотр связанных HTML только в этом представлении. В методе шаблона вам нужно будет оставить некоторый HTML вне представления шаблона, например «Главный заголовок или любые внешние границы / настройки».
  3. Хотите визуализировать частичное представление с помощью логики (из контроллера), используя URL.Action("action","controller").

Причины использовать Шаблон:

  1. Хотите удалить ForEach(Iterator). Шаблон достаточно хорош, чтобы идентифицировать модель как тип списка. Это будет сделано автоматически.
  2. Модель Centric Logic. Если в одном и том же отображении для папки «Шаблон» найдено несколько представлений, рендеринг будет зависеть от пройденной модели.
...