2009-06-29 14 views
6

Myślałem, że to będzie dość łatwe, ale jestem całkowicie zaskoczony.ASP.NET MVC Routing widoki poziomu root

Chcę, aby widoki jednego kontrolera znajdowały się na poziomie katalogu głównego aplikacji, a nie w podkatalogu tego kontrolera, ale nie mogę go znaleźć.

chciałbym mieć te dwa adresy URL:

/info - powinno to działanie "Info" na kontrolerze "Home"

/Admin/- To powinno być działanie "Index" (domyślnie) na kontrolerze "Admin"

Do tej pory nie ważne, co próbowałem, pierwsza trasa zakończy się połowem. Nie mogę oddzielić tych dwóch.

Strona informacyjna nie potrzebuje nawet kontrolera, jest statyczna, ale chcę użyć strony wzorcowej. Może być o wiele łatwiejszy sposób, żeby to wyciągnąć, ale też tego nie wymyśliłem.

Wszystko, co mogę myśleć, że to zadziała, to stworzenie kontrolera informacji i przeniesienie widoków/domu/informacji do widoków/informacji/indeksu, ale to ma pewien zapach.

udało mi się to zrobić w szynach przy użyciu:

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

Odpowiedz

6

Wystarczy odpowiednie trasy. W twoim przypadku:

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

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

Ale polecam Państwu podejście this.

Jeśli chcesz zmienić domyślną fizyczną lokalizację widoków/częściowych wyświetleń,
sprawdź, czy chcesz utworzyć niestandardowe mechanizmy wyświetlania.

+0

Nie myślałem, żeby statycznie je wytropić, czyli odłożyć słuchawkę na odnalezienie wzoru! Wydaje się, że powinien być bardziej dynamiczny sposób, więc nie muszę dodawać nowej trasy dla każdej strony. –

+0

Myślałem tak samo, ale nie jestem już tak optymistyczny. W każdym razie - przekierowanie przez atrybuty przypomina mi srebrną kulę. :) –

+0

Prawie jak jest ukryty slash, więc na końcu "/ Info" i "/ Admin /" w końcu trafiają na tę samą trasę, ponieważ "/ Info" zostaje potraktowane jako "/ Info /". I odwrotnie; jeśli ponownie zamówię trasy, pierwsza trasa nadal będzie obie. W takim przypadku wygląda to tak, jakby traktować "/ Admin /" jak "/ Admin". Sprawdzam routing oparty na atrybutach. Zdecydowanie wygląda obiecująco. –

0

Możesz używać atrybutów trasy.

W pliku konfiguracyjnym trasy powinieneś mieć.

 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 } 
     ); 

Następnie nad każdą czynnością możesz mieć atrybut trasy.

[Route("info")] 

Można nawet uzyskać bardziej zaawansowane z tych atrybutów poprzez dodanie parametrów i/lub podfoldery

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

Można umieścić powyższy atrybut wszelkich działań i będzie się wydawać, że to pochodzący z kontroler blogu. Jednak nie potrzebujesz nawet kontrolera blogu. Również {} oznacza parametr, więc upewnij się, że twoja akcja przyjmuje ten sam parametr co w nawiasach klamrowych. W tym przypadku parametr byłby następujący:

string postId 
Powiązane problemy