2013-06-18 17 views
18

Mój obszar znajduje się poniżej. Podkreślana jest tylko ta konkretna część.Sterownik w podkatalogu

enter image description here

Tabela Route

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
     "SubFolder", // Route name 
     "SubFolder/ChildController", 
     new { controller = "ChildController", action = "Index" }, 
     new[] { "Practise.Areas.SOProblems.Controllers.SubFolder" }); 


    routes.MapRoute(
     "Default", // Route name 
     "{controller}/{action}", // URL with parameters 
     new { controller = "Home", action = "Index" } // Parameter defaults 
    ); 
} 

This only works when the url is like this 
localhost:2474/SOProblems/ChildController/index 

This does not works when the url is like this 
localhost:2474/SOProblems/SubFolder/ChildController/index 

Czy możesz mi powiedzieć, czego brakuje?

+0

"Nie działa" oznacza dokładnie co? – TGlatzer

+0

@ Grumbler85 - ostatni wypróbowany URL daje 404, –

+0

Backtick jest tutaj tylko "SubFolder'/ChildController"? Sprawdź, czy przestrzeń nazw wewnątrz podfolderu jest ustawiona poprawnie. – TGlatzer

Odpowiedz

14

ta nie działa, gdy adres URL jest tak localhost: 2474/SOProblems/podkatalog/ChildController/index

to normalne. Wzór trasy wygląda następująco: SubFolder/ChildController, a nie SubFolder/ChildController/index. Oprócz tego zdefiniowałeś swoją trasę w WRONG miejscu. Zdefiniowałeś go w swoich głównych definicjach tras, a nie w definicjach tras w obszarze. Więc pozbyć definicji zwyczaj trasę z głównych tras i dodać go do pliku SOProblemsAreaRegistration.cs (co jest gdzie trasy SOProblems powinna zostać zarejestrowana):

public override void RegisterArea(AreaRegistrationContext context) 
{ 
    context.MapRoute(
     "SubFolderRoute", 
     "SOProblems/SubFolder/ChildController", 
     new { controller = "ChildController", action = "Index" }, 
     new[] { "Practise.Areas.SOProblems.Controllers.SubFolder" } 
    ); 

    context.MapRoute(
     "SOProblems_default", 
     "SOProblems/{controller}/{action}/{id}", 
     new { action = "Index", id = UrlParameter.Optional } 
    ); 
} 

też od swojej strukturze trasy (SOProblems/SubFolder/ChildController) nie ma możliwość określenia nazwy akcji, możesz wykonać tylko jedno działanie na tym kontrolerze i będzie to domyślna akcja, którą zarejestrowałeś (index) w tym przypadku.

Jeśli chcesz mieć więcej działań na tym kontrolerze, a jednak wskaźnik być jeden domyślny należy uwzględnić, że w swojej strukturze trasy:

context.MapRoute(
    "SubFolder", 
    "SOProblems/SubFolder/ChildController/{action}", 
    new { controller = "ChildController", action = "Index" }, 
    new[] { "Practise.Areas.SOProblems.Controllers.SubFolder" } 
); 

W obu przypadkach głównym definicja trasa może pozostać z ich wartościami domyślnymi :

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

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

Skąd pochodzi "RegisterArea"? Przeszukałem całe rozwiązanie z zerowym wynikiem. – usefulBee

+0

@usefulBee "RegisterArea" pojawia się, gdy Visual Studio utworzy nowy obszar _Add> ... – Jasen

5

Twoja nowa trasa "Podfolder" nie zawiera możliwości uwzględnienia akcji na trasie (w twoim przypadku "Indeks").

próbka URL

localhost:2474/SOProblems/SubFolder/ChildController/index 

chce spróbować dopasować trasy jak:

"SubFolder/ChildController/{action}" 

Ale nie obejmują „{akcja}” w trasie, więc wygrał” t Dopasuj swoją trasę. Następnie próbuje domyślnej trasy, która oczywiście kończy się niepowodzeniem.

spróbuj dodać "{akcja}" na trasie:

routes.MapRoute(
    "SubFolder", // Route name 
    "SubFolder/ChildController/{action}", 
    new { controller = "ChildController", action = "Index" }, 
    new[] { "Practise.Areas.SOProblems.Controllers.SubFolder" }); 

lub podjąć "wskaźnik" off swojej testowej URL.

+2

To nie działa. –