2009-06-29 4 views
6

Я думал, что это будет довольно легко, но я полностью озадачен.ASP.NET MVC Routing Root Level Views

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

Я хотел бы, чтобы эти два URLs:

/Info - это должно действие "Info" на контроллере "Home"

/Admin/- Это должно быть действие "Index" (по умолчанию) на контроллере «Admin»

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

Эта страница Info даже не нуждается в контроллере, она статична, но я хочу использовать главную страницу. Может быть, гораздо проще сделать это, но я тоже этого не понял.

Все, что я могу думать о том, что это сработает, было бы создание контроллера информации и перемещение представлений/Главная/Информация в представления/информация/указатель, но у этого есть определенный запах.

я был в состоянии сделать это в рельсах с помощью:

map.connect ':controller/:action/:id' 
    map.connect ':action', :controller => 'home' 

ответ

6

Вам просто нужно правильные маршруты. В вашем случае:

routes.MapRoute(
       "Info", 
       "Info", 
       new { controller = "Home", action = "Info" } 

routes.MapRoute(
       "Admin", 
       "Admin", 
       new { controller = "Admin", action = "Index" } 

Но я рекомендую вам подход this.

Если вам нужно изменить физическое расположение мест по умолчанию/частичное просмотрение,
check out how to создать нестандартные механизмы просмотра.

+0

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

+0

Я тоже думал, но я не настолько оптимистичен. В любом случае - прохождение через атрибуты выглядит как серебряная пуля для меня. :) –

+0

Почти как есть неявный трейлинг-косая черта, поэтому в конце «/ Info» и «/ Admin /» заканчиваются тем же маршрутом, потому что «/ Info» обрабатывается как «/ Info /». И наоборот; если я повторно закажу маршруты, первый маршрут по-прежнему ловит оба. В этом случае это похоже на то, что он обрабатывает «/ Admin /» как «/ Admin». Я проверяю маршрутизацию, основанную на атрибутах. Определенно выглядит многообещающим. –

0

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

В вашем файле конфигурации маршрута вы должны иметь.

 routes.MapMvcAttributeRoutes(); 
     AreaRegistration.RegisterAllAreas(); 
     //code below should already be in your route config by default 
     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

Затем над каждым действием вы можете получить атрибут маршрута.

[Route("info")] 

Вы даже можете получить более продвинутым с этими атрибутами, добавив параметры, и/или вложенные папки

[Route("blog/posts/{postId}")] 

Вы можете поставить выше атрибут любого действия, и он будет выглядеть, как будто это происходящий из контроллер блога. Однако вам даже не нужен контроллер блога. Также {} обозначает параметр, поэтому просто убедитесь, что ваше действие принимает тот же параметр, что и в фигурных скобках. В этом случае параметр будет

string postId