Это правильный шаблон для возврата различных представлений из контроллера ASP.NET MVC? - PullRequest
4 голосов
/ 09 июля 2010

У меня есть приложение, которое имеет публичный режим «конечного пользователя» и режим «бэк-офиса». Оба «режима» в значительной степени используют одну и ту же логику контроллера, но пользовательские интерфейсы для этих разных «режимов» радикально отличаются.

Используя стандартную маршрутизацию по умолчанию, которую вы получаете, когда проект создается впервые, у меня есть что-то вроде следующего:

Controllers\
  HomeController.cs

Views
  BackOffice
    Index.aspx
  Public
    Index.aspx

Shared
  BackOfficeSite.Master
  PublicSite.Master

В моем HomeController.cs у меня есть логика, которая выглядит следующим образом:

public ActionResult Index()
{
  var devices = DeviceRepository.FindDevicesByCustomer(100);

  if(IsBackOffice()) 
  {
     return View(@"~/Views/BackOffice/Index.aspx", devices);
  }

  return View(@"~/Views/Public/Index.aspx", devices);
}

Это правильный способ сделать это, или я копаю себе дыру против паттерна?

Я использую ASP.NET MVC 2.

Ответы [ 3 ]

3 голосов
/ 09 июля 2010

в ваших папках просмотра вы можете поместить BackOffice и Public в вашу папку Views / Home

Views
    Home
      BackOffice
        Index.aspx
      Public
        Index.aspx

и ваш обратный просмотр должен выглядеть следующим образом

return View("BackOffice/Index", devices);

return View("Public/Index", devices);

контроллер всегда будетСначала найдите View внутри папки View Name контроллера.Если вашим контроллером является HomeController, он всегда будет сначала искать представление в папке Views / Home.

1 голос
/ 09 июля 2010

Я бы сказал, что если данные, которые нужны обоим представлениям, одинаковы, то было бы хорошо использовать один и тот же контроллер / маршрут.

Однако, если они действительно так радикально отличаются, то каждое представлениеВероятно, вам понадобится собственный набор данных, в этом случае вы можете копаться в дыре.

Возможно, вы захотите вернуть результат другой функции вместо представления;что-то вроде этого:

return IsBackOffice()? getBackOfficeView() : getPublicView() ;

Таким образом, у вас нет группы if / else в одном и том же действии контроллера.

0 голосов
/ 09 июля 2010

Я бы написал движок представления, чтобы абстрагироваться от этого.Таким образом, все, что еще нужно сделать вашему контроллеру:

return View(); //or one of the overloads
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...