2012-05-23 5 views
8

Sto tentando di creare alcuni percorsi mappa personalizzata, ma non riesco a farlo funzionare abbastanza bene.personalizzato rottaMappa

Il mio obiettivo finale è quello di essere in grado di specificare qualcosa di simile alla seguente. Dove da I essenzialmente ho mio URL costruito con coppie di valori di "id" e "nome". Il nome è irrilevante e solo per convenevoli utente, mi richiederà l'ID nel mio controller però.

/dashboard/5-My-Estate-nome/89-My-sottogruppo-name/133-forse-anche-altro-sottogruppo

Per cominciare sto lavorando sulla prima sezione e avendo problemi.

Navigazione a "http: // localhost: 53933/dashboard/109-edificio-xyz", mentre utilizzando il seguente percorso genera l'errore A public action method '109-building-xyz' was not found on controller 'MyInterfaceInterface.Controllers.DashboardsController'.

routes.MapRoute(
    "Dashboard", 
    "dashboards/{id}-{name}", // URL pattern 
    new { controller = "Dashboards", action = "Index" }, 
    new { id = @"\d+", name = UrlParameter.Optional } 
); 

Ovviamente ho voluto questo per essere indirizzati alla funzione Index con parametri.

Cosa sto sbagliando? Sto strutturando anche questo correttamente? Io vengo da un background web PHP e usando htaccess per ottenere queste cose.

Grazie

+1

Hai aggiunto questo dopo il percorso predefinito o prima? – Chris

+0

penso che si può solo i parametri separati utilizzando una barra (ma potrebbe essere sbagliata su questo). Se il trattino è accettato come separatore, è probabile che dovrai includere il trattino dopo l'id per far funzionare il percorso. Inoltre, come suggerisce Chris, l'ordinamento dei percorsi è importante. Consiglierei di usare NuGet per installare il pacchetto RouteDebugger (e abilitarlo in Web.config). Ti permette di scoprire facilmente quale percorso corrisponde a un dato URL. –

risposta

9

L'ordine dei percorsi è importante. MVC abbinerà la prima rotta dichiarata con un pattern che corrisponde al pattern URL.

Quindi, se avete questo:

routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", // URL pattern 
    new { controller = "Home", action = "Index" }, 
    new { id = UrlParameter.Optional } 
); 
routes.MapRoute(
    "Dashboard", 
    "dashboards/{id}-{name}", // URL pattern 
    new { controller = "Dashboards", action = "Index" }, 
    new { id = @"\d+", name = UrlParameter.Optional } 
); 

allora che cosa succederà con l'URL http://localhost:53933/dashboards/109-building-xyz è che MVC corrisponderà "cruscotti" al controller e "109-edificio-xyz" per l'azione.

È necessario dichiarare sempre i percorsi più specifici prima, e gli itinerari più generali in seguito, in questo modo:

routes.MapRoute(
    "Dashboard", 
    "dashboards/{id}-{name}", // URL pattern 
    new { controller = "Dashboards", action = "Index" }, 
    new { id = @"\d+", name = UrlParameter.Optional } 
); 
routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", // URL pattern 
    new { controller = "Home", action = "Index" }, 
    new { id = UrlParameter.Optional } 
); 

Tuttavia, Morten Mertner è proprio nel suo commento - Non credo che si può avere 2 parametri di percorso che non sono separati da una barra in avanti. Dovresti cambiare il tuo pattern URL in qualcosa di simile per utilizzarlo con il motore di routing predefinito:

"dashboards/{id}/{name}"