2012-05-17 3 views
6

Sono nuovo ad ASP.NET MVC3.Percorso errato rilevato e ActionLink genera un collegamento ipertestuale errato

Ho configurato alcuni percorsi in Global.asax, rispetto al quale sto generando alcuni collegamenti ipertestuali usando il metodo helper @ Html.ActionLink.

Tutti i collegamenti sono sempre resi correttamente, tranne quello in alto nel seguente codice:

Global.asax

routes.MapRoute(
    null, 
    "Section/{Page}/{SubPage}/{DetailPageName}", 
    new { controller = "Base" } 
    ); 

routes.MapRoute(
    null, 
    "Section/{Page}/{SubPage}", 
    new { controller = "Base", action = "SubPage" } 
    ); 

routes.MapRoute(
    null, 
    "Section/{Page}", 
    new { controller ="Base", action="LandingPage"} 
    ); 

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

codice ActionLink

@Html.ActionLink(@subPages.LinkedPageName, "DetailPage", 
    new { 
     Controller = "Base", 
     Page = @ViewBag.PageName, 
     SubPage = @Model.SubPageName, 
     DetailPageName = subPages.LinkedPageName 
    }) 

È possibile che questo dovrebbe scegliere il percorso superiore, ovvero:

routes.MapRoute(
    null, 
    "Section/{Page}/{SubPage}/{DetailPageName}", 
    new { controller = "Base" } 
    ); 

Ma sta selezionando il percorso predefinito!

+0

Ho notato che non vi è alcuna azione definita nel primo percorso. – Jacob

risposta

2

In questa definizione percorso:

routes.MapRoute(
    null, 
    "Section/{Page}/{SubPage}/{DetailPageName}", 
    new { controller = "Base" } 
    ); 

Le seguenti condizioni devono essere soddisfatte in modo che il percorso da abbinare:

  1. Se c'è un parametro controller passato nelle ActionLink allora il suo valore deve essere Base
  2. Il parametro Page deve essere specificato e non deve essere vuoto perché non ha valore predefinito
  3. Il parametro SubPage deve essere specificato e deve essere non vuoto perché non ha valore predefinito
  4. Il parametro DetailPageName devono essere specificati e deve essere non vuoto perché non ha un valore predefinito

Quindi, in questo chiamata a ActionLink:

@Html.ActionLink(@subPages.LinkedPageName, "DetailPage", 
    new { 
     Controller = "Base", 
     Page = @ViewBag.PageName, 
     SubPage = @Model.SubPageName, 
     DetailPageName = subPages.LinkedPageName 
    }) 

Condizione # 1 è chiaramente soddisfatto. Ma le condizioni # 2, # 3 e # 4 potrebbero non essere soddisfatte perché i loro valori potrebbero essere nulli.

E poiché si specifica che il percorso che termina con la corrispondenza è la route predefinita, ho il sospetto che il parametro Page sia nullo o vuoto. ovvero, @ViewBag.PageName restituisce un valore nullo o vuoto.

Controllare il codice (forse nel debugger o stamparlo nella vista) per vedere se la proprietà PageName ha un valore.