ASP.NET MVC: Когда использовать пользовательские методы HTML-хелпера vs Html.RenderAction?

Немного неясно, когда использовать специальный вспомогательный метод и когда использовать RenderAction, а также, когда просто использовать ViewData. Некоторые из их функций немного перекрываются.

Например, если бы я должен был создать панель навигации Category, я бы создал новый вспомогательный метод и поместил его в некоторый частичный вид? Сначала я изначально занимался этим, но я читал в блоге, чтобы вместо этого использовать RenderAction. Я только что думал взад и вперед и мог использовать некоторую помощь не только с этим примером, но в целом.

Предположим, что список категорий исходит из некоторого источника данных.

Ответ 1

Ниже приводятся следующие общие рекомендации:

Методы HtmlHelper:

  • Используется для стандартизации разметки. Я использую помощники, чтобы убедиться, что поля формы, кнопки ввода и теги изображений используют согласованную разметку.
  • Используется, когда результирующая разметка минимальна. Маленькие биты текста, разметка поля формы и т.д. Я не использую помощники для создания полных объектов домена.
  • Работайте с небольшим количеством дискретных аргументов. Если мне нужно перебирать коллекцию и отображать что-то, это частичное. Если мне нужно взять большой объем ввода, это тоже частично.
  • Не содержат никакой бизнес-логики, просто логики представления. Аргументы обычно являются объектами в домене решений, а не бизнес/проблемным доменом.
  • Как правило, они очень общие по охвату и применяются к большим частям приложения.

Частично рендеринг:

  • Используется, когда я хочу разложить большой вид на более мелкие куски. Модель должна быть подмножеством модели "основного" вида.
  • Частичные виды часто используются только определенными контроллерами или областями.

Действие Render:

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

ViewData:

Я буду использовать ViewData для отслеживания глобальных данных, которые применяются ко всем представлениям, таким как текущий пользователь. Если мне нужен последовательный способ отображения этих данных, я обычно создаю для него частичное, а затем выполняю RenderPartial() на главной странице.

Ответ 2

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

Разница между 1) RenderPartial/HtmlHelper vs. 2) RenderAction - это контроллер, в котором эта бизнес-логика:

  • в действии одного контроллера, который выполняет всю страницу или
  • в отдельном действии контроллера, специфичном для частичного представления.

Если вы используете данные своей категории в значительной степени на каждой странице, я не вижу неправильного получения ее для каждой страницы на уровне действия на уровне страницы и передачи ее в данные представления. Конечно, вы бы использовали какой-то механизм (базовый класс пользовательской модели, расширение контроллера,...), чтобы у вас не было одинакового вызова функции выбора категории в каждом действии (при условии, что у вас есть много).

Если некоторые просмотры страниц выбирают показывать категории, некоторые из них, а некоторые, возможно, имеют другой контроль категории с другой бизнес-логикой, то RenderAction определенно лучше. Даже в приведенном выше случае RenderAction хорош: он отделяет выбор категории от других данных в действиях вашего контроллера.

Затем нужно ли использовать RenderPartial или HtmlHelper... Для меня HtmlHelpers должны быть более обобщенными и не определенными для конкретного вида или модели, но это, я полагаю, больше относится к вкусу, чем к четкому правилу с точки зрения MVC: оба должны быть просто View-logic.

Ответ 3

Я бы выбрал html вспомогательные методы, когда сценарий соответствует этим критериям:

  • Аргументы не считаются данными модели
  • Он не должен генерировать чрезмерное количество разметки
  • html может быть сгенерирован только с приведенными ему аргументами

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

Ответ 4

Я новичок в использовании RenderAction

но когда мне нужно загрузить данные для определенной части экрана, теперь я иду RenderAction

Идеально подходит для загрузки облака тегов, которые отображаются на каждой странице, но данные не относятся к странице.