2013-06-18 2 views
18

La mia area è di sotto. Solo la parte interessata è evidenziata.Controller nella sottocartella

enter image description here

Tabella percorso

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 

Può cortesemente dirmi che cosa manca?

+0

"Non funziona", che significa esattamente? – TGlatzer

+0

@ Grumbler85 - l'ultimo URL provato dà 404, –

+0

L'apice è solo "Sottocartella"/ChildController "? E controlla che lo spazio dei nomi all'interno della sottocartella sia impostato correttamente. – TGlatzer

risposta

14

Questo non funziona quando l'URL è come questo localhost: 2474/SOProblems/SubFolder/ChildController/index

Questo è normale. Il modello di instradamento si presenta così: SubFolder/ChildController e non SubFolder/ChildController/index. In aggiunta a ciò hai definito il tuo percorso nel posto sbagliato. Lo hai definito nelle definizioni della tua rotta principale e non nelle definizioni di percorso della tua zona. Così sbarazzarsi della definizione percorso personalizzato da percorsi principali e aggiungerlo al file SOProblemsAreaRegistration.cs (che è dove devono essere registrati i tuoi SOProblems delle vie aeree):

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

Anche perché il vostro modello di percorso (SOProblems/SubFolder/ChildController) non ha la possibilità di specificare un nome dell'azione, è possibile avere solo un'azione su questo controller e quella sarebbe l'azione predefinita registrata (index) in questo caso.

Se si voleva avere più azioni su questo controller e tuttavia indice di essere quello di default si dovrebbe includere che nel vostro modello di percorso:

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

In entrambi i casi la tua definizione della rotta principale potrebbe rimanere con i loro valori di default :

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

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

Da dove viene il "RegisterArea"? Ho cercato l'intera soluzione con zero risultati. – usefulBee

+0

@usefulBee "RegisterArea" nasce quando Visual Studio racchiude una nuova _Add> Area ..._ – Jasen

5

Il tuo nuovo percorso "Sottocartella" non include la possibilità di includere un'azione nel percorso (nel tuo caso, "Indice").

L'URL di campione

localhost:2474/SOProblems/SubFolder/ChildController/index 

vuole cercare di abbinare un percorso simile:

"SubFolder/ChildController/{action}" 

Ma non si include il "{azione}" nel percorso, in modo che ha vinto' t corrisponde al tuo percorso. Prova quindi la route di default, che ovviamente fallisce.

Prova ad aggiungere "{} azione" per il percorso:

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

o prendere "indice" il vostro URL di prova.

+2

Questo non funziona. –