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:
они уважают иерархии моделей при рендеринге HTML-помощников (например, если вы у вас есть объект "Bar" на вашей модели "Foo", элементы HTML для "Bar" будут отображаться с помощью " Foo.Бар.ElementName", в то время как частичное будет иметь"ElementName").
более надежный, например, если у вас есть
List<T>что-то в вашем ViewModel, вы могли бы использовать@Html.DisplayFor(model => model.CollectionOfFoo), и MVC достаточно умен, чтобы видеть, что это коллекция и отображать один дисплей для каждого элемента (в отличие от частичного, что потребует явного цикла for).
Я тоже слышал DisplayFor делает шаблон "только для чтения", но я этого не понимаю - не могу ли я бросить форму там?
может кто-нибудь сказать мне некоторые другие причины? Есть ли список / статья где-то сравнивая три?
5 ответов:
EditorForvsDisplayForпрост. Семантика методов заключается в создании представлений редактирования/вставки и отображения/чтения (соответственно). Используйте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просмотр подхода, если:
- Просмотр Центрической Логики
- что держать все
_partialпросмотр связанного HTML только в этом представлении. В методе шаблона вам нужно будет сохранить некоторый HTML вне представления шаблона, например " главный заголовок или любые внешние границы/настройки.- хотите сделать частичный вид с логикой (от контроллера) с помощью
URL.Action("action","controller").причины использования шаблона:
- удалить
ForEach(Iterator). Шаблон достаточно хорошо, чтобы определить модель как тип списка. Он будет делать это автоматически.- Модель Логики, Ориентированной. Если в одной папке шаблона displayfor найдено несколько представлений, то отрисовка будет зависеть от переданной модели.
еще одно отличие, которое до сих пор не упоминалось, заключается в том, что partialview не добавляет префиксы модели, а шаблон делает здесь вопрос
Comments