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
Идеально подходит для загрузки облака тегов, которые отображаются на каждой странице, но данные не относятся к странице.