ASP.NET MVC - плохая идея возвращать разные представления из одного действия контроллера? - PullRequest
8 голосов
/ 08 января 2009

Я работаю над проектом ASP.NET MVC, где я использую маршрутизацию для создания дружественных URL-адресов, и у меня возникла проблема, которую я не знаю, как лучше решить.

Маршрутизация, которую я настроил, работает следующим образом

{категория}

{категория} / {производитель}

{категория} / {производитель} / {продукт}

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

Категория1 Отображает

  • A, за которым следует
  • Изображение, за которым следует
  • Список продуктов

Категория2 Дисплеи

  • Изображение, за которым следует
  • Акции, сопровождаемые
  • Описание

Я обошел это, имея enum ViewTemplate, связанный с категорией, и затем возвращаю представление с тем же именем, но это не так, во-первых, потому что я не уверен, что я должен быть таким, действие контроллера, а также я все еще делаю те же самые вызовы базы данных, что хорошо для некоторых вещей, но если у категории есть 500 продуктов, я все равно вытаскиваю их из базы данных даже для категории 2, когда они не будут использоваться. Теперь к делу:

  1. Верно ли возвращать разные виды с одного и того же действия контроллера?
  2. Как бы вы справились с загрузкой разных данных для каждого представления?
  3. Если я ошибаюсь (что я думаю) Как я должен делать что-то подобное?

Спасибо за любую помощь, вы могли бы быть.

Ответы [ 2 ]

8 голосов
/ 08 января 2009

Я здесь не гуру, но в других средах MVC я делал (и видел) похожие вещи. Задача Контроллера состоит в том, чтобы определить, какой View возвращается, основываясь на том, кто спрашивает, что спрашивают и т. Д. То, как вы определяете имя View, действительно зависит от того, что лучше для вашего приложения и / или его модифицируемости / тестируемости.

5 голосов
/ 08 января 2009

в MVC ответственность за то, какое представление вернуть, лежит на контроллерах, и поэтому вполне нормально иметь контроллер, который возвращает несколько различных представлений. Контроллеры должны быть относительно простыми. Они должны принять инструкцию от клиента. Доступ к модели, чтобы начать любые изменения, которые необходимо внести. Получить некоторые данные из модели. И используйте эти данные, чтобы решить, какое представление показать клиенту.

В вашей ситуации я думаю, что контроллер должен сделать следующее:

  1. Получить общую информацию о продукте.
  2. Используйте эту общую информацию, чтобы решить, какой вид использовать.
  3. Получить данные для этого конкретного представления.
  4. Вернуть вид.

Я думаю, что если вы обеспокоены тем, что делаете неправильно, вам нужно убедиться, что модель содержит только те методы, которые имеют смысл в контексте предметной области. Они не должны быть слишком тесно связаны с определенным взглядом. например, Product.GetDataForMiniProductView (int id) неверен. Это должна быть логика контроллера. с другой стороны, Product.GetStockCount обязательно должен быть в модели, а не в контроллере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...