2009-09-09 4 views
5

Обычно мои адреса выглядят как стандарт: www.example.com/controller/actionКак настроить маршрутизацию для моего раздела admin в ASP.NET MVC?

Теперь я хочу, чтобы настроить мой раздел администрирования, как:

 
www.example.com/admin/ 
www.example.com/admin/user/list 
www.example.com/admin/content/add 
etc. 

Так формат: www.example.com/admin/controller/action

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

ответ

11

Вам просто нужно нарисовать новый путь с разделом «admin», жестко запрограммированным в начале определения маршрута.

Например добавьте в ваши маршруты в RegisterRoutes в файле Global.asax.cs и убедитесь, что он появляется над маршрутом по умолчанию (если вы еще не добавили другие маршруты):

routes.MapRoute(
    "Default",            
    "admin/{controller}/{action}/{id}",      
    new { controller = "Home", action = "Index", id = "" } 
); 

Примечание: «Администрирование» часть жестко запрограммирована в начале определения маршрута.

Примечание 2: Если вы добавили другие маршруты за пределы по умолчанию, вам необходимо убедиться, что ваши маршруты упорядочены правильно.

Вот ссылка на хороший блог от Scott Guthrie относительно MVC маршрутизации: URL Routing

+3

Использование вещей делает другие контроллеры слишком доступными с помощью префикса 'admin /'. Вы можете посетить свой сайт/дом через свой сайт/admin/Home. –

6

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

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

Другими словами, вместо того, чтобы:

/content/list (for normal users) 
/admin/content/add (for admins) 

Вы бы

/content/list (for everyone) 
/content/add (for admin, but must be authenticated to work) 

Добавление/администратор/в URL на самом деле не добавлять ПРЕИМУЩЕСТВА (за исключением, возможно, что вы можете написать ваша логика обеспечения только одним правилом против чего-либо под/admin), но компромисс - более сложные маршруты и нарушение стандартного RESTful. Нарушение стандартных правил само по себе не является плохим, но вы должны учитывать, что они являются стандартными по какой-либо причине, и если у вас нет особых преимуществ для их устранения, вы можете подумать о том, чтобы придерживаться их.

Следует отметить, что в обоих стилях URL необходимо аутентифицировать пользователя, иначе любой может его использовать.

В ASP.NET MVC вы можете ограничить доступ к действиям (или даже целым контроллерам) на основе уровня пользователя с помощью ActionFilters. Украшая ваши действия только администратором с помощью этих фильтров, вы можете гарантировать, что только аутентифицированные административные пользователи могут их использовать.

Прочтите Scott Gu's запись в блоге или Rob Connery's post для получения дополнительной информации.

+0

Как бы вы обрабатывали действие списка для пользователей (у них нет доступа ко всему) и действие списка для админов (где они все видят)? Я бы предпочел не иметь список списка действийAdmin или что-то глупое. Или я ошибаюсь. –

+0

@MrRogers - Это действительно зависит от того, как они будут отличаться. Если единственное различие заключается в том, какое и сколько данных будет показано, вы обычно будете придерживаться одного и того же представления, но пусть контроллер укажет, какие данные должны быть показаны. Если два представления на самом деле немного отличаются (например, с кнопками редактирования/удаления для администраторов), вы можете проверить статус администратора в шаблоне представления с условным выражением. Вы можете установить статус администратора в ViewData или в сеансе. Один из последних вариантов - вывести их в частичные. Итак, у вас есть только 1 view, list.aspx, но тогда администратор против обычного пользователя каждый в частичном. – Matt

3

Начиная с версии MVC 2, они добавили концепцию «площадь», которая позволяет сделать это правильно :) Вот ScottGu's post about MVC 2 Preview.

+0

Области - хорошая функция в MVC2, но в этом конкретном случае вы все еще разбиваете один и тот же ресурс на разные контроллеры. Итак, вместо того, чтобы объединить всю вашу логику «контента» в одном контроллере, вы разобьёте ее. В этом случае вы, скорее всего, нарушите правило DRY. Не говоря уже о семантической розни. – Matt

+0

Ну, все зависит от того, что делает интерфейс администратора. Если это бэкэнд для администрирования системы, это совершенно другая вещь из вашего контента. Если это просто добавить функциональность, то да, ваше предложение просто ограничить ее аутентификацией, вероятно, лучше. Но я сомневаюсь, что все дело в интерфейсе администратора. – Runeborg