Как назвать / разделить контроллеры в приложении MVC3 - PullRequest
0 голосов
/ 15 сентября 2011

На данный момент у меня есть 3 контроллера: Home, Summary и Detail Однако у каждого из них есть только одно действие: индексирование, отображение и отображение соответственно.

Этот неприятный запах для меня.

Я надеялся использовать MapRoute для разрешения:

myapp/Home
myapp/Summary/prop1/prop2
myapp/Detail/prop1/prop2/prop3

вместо

myapp/Home
myapp/Summary/Display/prop1/prop2
myapp/Detail/Display/prop1/prop2/prop3

и, таким образом, пропускаем часть «Дисплей» ... но опять же, это не пахнет правильно. Хотя это работает, это означает добавление ссылок вручную вместо использования Html.ActionLink (...)

Было бы лучше, чтобы в одном контроллере были все дома / индекс, дом / сводка и дом / подробности?

Я надеялся предоставить простую структуру URL-адреса, чтобы пользователи, которые знают, что они делают, могли просто набрать ее, как указано выше ... часть "Домой", похоже, пропущена?

Ответы [ 5 ]

0 голосов
/ 17 сентября 2011

Я согласен с @Tim, что вы должны использовать один контроллер. Контроллер - это логическая группа действий; например, операции CRUD для Foo. NerdDinner является хорошим примером этого.

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

 routes.MapRoute("Default",      //RouteName
   "{controller}/{action}/{id}", //RouteUrl
   new {                         //RouteDefaults
       controller = "Home", 
       action = "Index", 
       id = UrlParameter.Optional}
 )

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

Ваши желаемые URL:

MyApp / Home
MyApp / Резюме / prop1 / prop2
MyApp / Detail / prop1 / prop2 / prop3

Настройка контроллера:

public class HomeController : Controller 
{
     public ActionResult Index() { ... }

     public ActionResult Summary() { ... }

     public ActionResult Details() { ... } 
}

Настройка маршрутизации:

 routes.MapRoute("Home-Index",      //RouteName
   "myapp/Home", //RouteUrl
   new {                         //RouteDefaults
       controller = "Home", 
       action = "Index"});

 routes.MapRoute("Home-Summary",      //RouteName
   "myapp/Summary/prop1/prop2", //RouteUrl
   new {                         //RouteDefaults
       controller = "Home", 
       action = "Summary",
       prop1 = UrlParameter.Optional,
       prop2 = UrlParameter.Optional});

 routes.MapRoute("Default",      //RouteName
   "{controller}/{action}/{id}", //RouteUrl
   new {                         //RouteDefaults
       controller = "Home", 
       action = "Index", 
       id = UrlParameter.Optional}
 )

Теперь следует отметить несколько важных вещей:

  1. Маршрутизация работает как оператор switch, первый соответствующий URL-адрес тот, который он будет использовать, поэтому у вас есть последний как последний один.

  2. URL-адрес, определенный в вашем маршруте карты, может быть любым, что вы хотите. Это не должен совпадать с контроллером, потому что как только вы удалите заполнители ({controller} и т. д.), которые он использует по умолчанию для навигации. Таким образом, URL-адрес маршрута Home-Index может быть myapp / foo / bar / baz и id все равно приведет вас к действию Home index.

  3. Заполнители работают автоматически. Мне не удалось найти хороший ресурс, объясняющий, как работает маршрут по умолчанию.

Надеюсь, это поможет.

0 голосов
/ 15 сентября 2011

Если вы хотите, чтобы ваши URL-адреса были

myapp/Home 
myapp/Summary/prop1/prop2  
myapp/Detail/prop1/prop2/prop3

Затем вы делаете 3 контроллера

HomeController SummaryController DetailController

Каждый из них будет иметь 1 действие

public ActionResult Index () {

}

Для контроллера SUmmary и Detail вы просто передадите несколько дополнительных параметров в действие Index

0 голосов
/ 15 сентября 2011

Вам нужен только один контроллер и внутри него несколько действий ..

публичный класс HomeController: контроллер {

 public ActionResult Index()
    {

}

 public ActionResult Summary()
    {

}

 public ActionResult Details()
    {

} }

В действии ссылка

@Html.ActionLink («Подробности», «Детали», «Домой»);

этого достаточно, не нужно добавлять несколько контроллеров ..

Надеюсь, это поможет ..

0 голосов
/ 15 сентября 2011

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

Вы можете прикрепить все действия в контроллере Home, чтобы ваши маршруты были

myapp/Home
myapp/Home/Summary/prop1/prop2 
myapp/Home/Details/prop1/prop2/prop3 

В этом варианте у вас есть 1 контроллер, 3 действия и 2 дополнительных маршрута для обработки URls

Зависит от того, что такое краткое изложение и детали? Например, если это резюме заказа, я бы предпочел

myapp/Orders/Summary/prop1/prop2
myapp/Orders/Details/prop1/prop2/prop3

В этом случае у вас будет контроллер Home и действие Index, а затем контроллер Orders с двумя действиями. Я бы сказал, что «Сводка» и «Сведения» обычно предполагают, что вы все равно что-то отображаете, поэтому вам не понадобится часть «Отображать», как в ваших предложениях.

0 голосов
/ 15 сентября 2011

Не уверен, что я полностью понял ваш вопрос, но как насчет создания базового класса контроллеров, который наследуется от Controller, и вместо него будут ваши общие действия? Таким образом, вам не нужно повторяться так много.

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