ASP.NET в MVC 3 - частичная против отображения шаблона против редактора шаблонов



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



для создания повторно используемых компонентов в ASP.NET MVC, у нас есть 3 варианта (могут быть и другие, о которых я не упоминал):



Частичный Вид:



@Html.Partial(Model.Foo, "SomePartial")


Пользовательский Шаблон Редактора:



@Html.EditorFor(model => model.Foo)


Пользовательский Шаблон Дисплея:



@Html.DisplayFor(model => model.Foo)


С точки зрения фактического представления/HTML, все три реализации идентично:



@model WebApplications.Models.FooObject

<!-- Bunch of HTML -->


Итак, мой вопрос - когда/как вы решаете, какой из трех использовать?



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



вот 2 вещи, которые я нашел лучше с EditorFor / DisplayFor:




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


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



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



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

646   5  

5 ответов:

EditorFor vs DisplayFor прост. Семантика методов заключается в создании представлений редактирования/вставки и отображения/чтения (соответственно). Используйте DisplayFor при отображении данных (т. е. при создании divs и spans, содержащих значения модели). Используйте EditorFor при редактировании / вставке данных (т. е. при создании входных тегов внутри формы).

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

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

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

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

вы конечно может настройка DisplayFor для отображения редактируемой форме. Но конвенция для DisplayFor на readonly и EditorFor для редактирования. Придерживаясь конвенции будет гарантировать, что независимо от того, что вы переходите в DisplayFor, Он будет делать то же самое.

просто чтобы дать мою ценность 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>

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

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

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

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

причины использования шаблона:

  1. удалить ForEach(Iterator). Шаблон достаточно хорошо, чтобы определить модель как тип списка. Он будет делать это автоматически.
  2. Модель Логики, Ориентированной. Если в одной папке шаблона displayfor найдено несколько представлений, то отрисовка будет зависеть от переданной модели.

еще одно отличие, которое до сих пор не упоминалось, заключается в том, что partialview не добавляет префиксы модели, а шаблон делает здесь вопрос

Comments

    Ничего не найдено.