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