Таким образом, название должно говорить само за себя.
Для создания повторно используемых компонентов в 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 (например, если у вас есть объект "Bar" в вашей модели "Foo", элементы HTML для "Bar" будут отображаться с "Foo.Bar.ElementName", тогда как частичное будет иметь " ElementName ").
Более надежный, например, если у вас есть
List<T>
что-то в вашей ViewModel, вы можете использовать его@Html.DisplayFor(model => model.CollectionOfFoo)
, и MVC достаточно умен, чтобы видеть его как коллекцию и отображать одно отображение для каждого элемента (в отличие от Partial, для которого требуется явное петля).
Я также слышал, что DisplayFor отображает шаблон «только для чтения», но я не понимаю этого - разве я не могу добавить туда форму?
Может кто-нибудь сказать мне другие причины? Есть ли где-нибудь список / статья, сравнивающая три?
Ответы:
EditorFor
противDisplayFor
просто. Семантика методов состоит в том, чтобы генерировать представления редактирования / вставки и отображения / только для чтения (соответственно). ИспользуетсяDisplayFor
при отображении данных (т. Е. При создании элементов div и span, которые содержат значения модели). ИспользуетсяEditorFor
при редактировании / вставке данных (т. Е. При создании входных тегов внутри формы).Вышеуказанные методы ориентированы на модель. Это означает, что они будут учитывать метаданные модели (например, вы можете аннотировать класс вашей модели с помощью
[UIHintAttribute]
или,[DisplayAttribute]
и это будет влиять на то, какой шаблон будет выбран для создания пользовательского интерфейса для модели. Они также обычно используются для моделей данных (то есть моделей, которые представлять строки в базе данных и т. д.)С другой стороны,
Partial
он ориентирован на просмотр, так как вас больше всего интересует выбор правильного частичного вида. Представлению не обязательно нужна модель для правильного функционирования. У него может быть общий набор разметки, который повторно используется по всему сайту. Конечно, часто вы хотите повлиять на поведение этой части, и в этом случае вы можете захотеть передать соответствующую модель представления.Вы не спрашивали о том,
@Html.Action
что также заслуживает упоминания здесь. Вы можете думать о нем как о более мощной версии,Partial
заключающейся в том, что он выполняет дочернее действие контроллера и затем отображает представление (которое обычно является частичным представлением). Это важно, потому что дочернее действие может выполнять дополнительную бизнес-логику, которая не принадлежит частичному представлению. Например, он может представлять компонент корзины покупок. Причиной его использования является недопущение выполнения работ, связанных с корзиной покупок, в каждом контроллере вашего приложения.В конечном итоге выбор зависит от того, что именно вы моделируете в своем приложении. Также помните, что вы можете смешивать и сочетать. Например, у вас может быть частичное представление, которое вызывает
EditorFor
помощника. Это действительно зависит от того, что представляет собой ваше приложение и как его учитывать, чтобы стимулировать максимальное повторное использование кода, избегая при этом повторения.источник
Вы, конечно, можете настроить
DisplayFor
отображение редактируемой формы. Но соглашение предназначено для того,DisplayFor
чтобы бытьreadonly
иEditorFor
быть для редактирования. Соблюдение соглашения гарантирует, что независимо от того, во что вы переходитеDisplayFor
, оно будет делать то же самое.источник
Просто для того, чтобы оценить мой уровень 2c, наш проект использует частичное представление с несколькими вкладками jQuery, и каждая вкладка отображает свои поля со своим частичным представлением. Это работало нормально, пока мы не добавили функцию, благодаря которой некоторые вкладки имели общие поля. Наш первый подход к этому состоял в создании другого частичного представления с этими общими полями, но это стало очень неуклюжим при использовании EditorFor и DropDownListFor для визуализации полей и выпадающих списков. Чтобы получить уникальные идентификаторы и имена, мы должны были отобразить поля с префиксом в зависимости от родительского частичного представления, которое его отображало:
Это стало довольно уродливо, поэтому мы решили использовать вместо этого шаблоны редактора, которые работали намного чище. Мы добавили новую модель представления с общими полями, добавили соответствующий шаблон редактора и визуализировали поля с использованием шаблона редактора из разных родительских представлений. Шаблон редактора правильно отображает идентификаторы и имена.
Короче говоря, убедительной причиной использования шаблонов редактора была необходимость отображать некоторые общие поля на нескольких вкладках. Частичные представления не предназначены для этого, но шаблоны редактора отлично справляются со сценарием.
источник
Используйте
_partial
подход просмотра, если:_partial
представления, связанные HTML только в этом представлении. В методе шаблона вам нужно будет оставить некоторый HTML вне представления шаблона, например «Главный заголовок» или любую внешнюю границу / настройки.URL.Action("action","controller")
.Причины использовать шаблон:
ForEach(Iterator)
. Шаблон достаточно хорош, чтобы идентифицировать модель как тип списка. Это будет сделано автоматически.источник
Еще одно различие, которое не было упомянуто до сих пор является то , что PartialView не добавляет модели префиксов в то время как шаблон делает здесь является вопрос
источник