Использование одного контроллера или нескольких контроллеров для меню страницы навигации

#asp.net-mvc #asp.net-mvc-routing

#asp.net-mvc #asp.net-mvc-routing

Вопрос:

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

если у меня есть меню на странице, которое выглядит следующим образом

  • Сообщения
  • Профиль
  • входящие
  • приобретенные товары

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

 www.somepage.com/messages
www.somepage.com/profile
www.somepage.com/items purchased
 

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

это лучше? 1 контроллер (меню) с несколькими действиями, отображающими различные области меню

 www.somepage.com/menu/messages
www.somepage.com/menu/profile
www.somepage.com/menu/items purchased
 

последнее, что нужно иметь в виду, это то, что я хочу иметь пункты подменю, например
, в меню / сообщениях, которые я хочу получать / отправлять, так как это будет выглядеть?

 www.somepage.com/menu/messages/incoming 
www.somepage.com/menu/messages/outgoing
 

или было бы лучше иметь

 www.somepage.com/messages/incoming
www.somepage.com/messages/outgoing
 

Ответ №1:

У вас может быть столько контроллеров, сколько вы хотите, и вы обязательно должны воспользоваться этим. Вы всегда должны разбивать свой код на минимально возможные логические единицы. Это относится к каждому классу, будь то контроллер, объект, модель представления, что угодно. Одно из золотых правил ООП заключается в том, что класс должен делать что-то одно и делать это хорошо. У вас никогда не должно быть одного большого класса, который содержит все виды совершенно не связанных функций, а поскольку контроллер — это просто класс, он также применяется к контроллерам.

Ваш контроллер должен содержать только действия, которые касаются одной вещи, о которой ваш контроллер. Как правило, это в конечном итоге является конкретной сущностью и отражается в имени контроллера. Таким образом, для сообщений у вас может быть a MessagesController , и все действия, связанные с сообщениями, будут отправляться туда. Но для profile вам следует создать новый контроллер, возможно, вызываемый ProfileController , и поместить туда эти действия.

Комментарии:

1. Хорошо, я буду использовать разные контроллеры для каждого пункта меню. Но как насчет представления? В каждом представлении должен быть html для меню и _Layout.cshtml(навигация), чтобы все они выглядели одинаково. Что было бы лучше всего сделать здесь? Поместить меню в единый общий вид с _Layout.cshtml в нем и заставить их всех использовать его? Или я должен использовать частичные или что-то в этом роде? Вроде как новичок!

2. Для каждого частичного представления наблюдается небольшое снижение производительности, поэтому для чего-то относительно статичного, такого как навигация по сайту, вам, вероятно, следует просто поместить его непосредственно в макет. Однако в любом случае все в порядке.

Ответ №2:

Это все своего рода предпочтения, но я думаю, что стандартными будут разные контроллеры.

Разные контроллеры обеспечивают разделение по умолчанию, и если вы используете маршруты по умолчанию, это прекрасно работает, если вы хотите добавить подменю.

 www.somepage.com/profile -- standard profile page
www.somepage.com/profile/edit -- edit profile page with nice route
 

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

Преимущества их использования в одном контроллере заключаются в том, что у вас есть только одно место для просмотра / обслуживания при редактировании этих конкретных действий (shrug).

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