2009-04-09 6 views
50

Ho problemi con Html.ActionLink quando ho un percorso che richiede più di un parametro. Per esempio, date le seguenti percorsi definiti nel mio file Global.asax:ASP.NET MVC Routing URL con più valori di instradamento

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

routes.MapRoute(
    "Tagging", 
    "{controller}.mvc/{action}/{tags}", 
    new { controller = "Products", action = "Index", tags = "" } 
); 

routes.MapRoute(
    "SlugsAfterId", 
    "{controller}.mvc/{action}/{id}/{slug}", 
    new { controller = "Products", action = "Browse", id = "", slug = "" } 
); 

I primi due percorsi funzionano senza problemi, ma quando cerco di creare un collegamento azione per il terzo percorso con:

<%= Html.ActionLink(Html.Encode(product.Name), "Details", new { id = product.ProductId, slug = Html.Encode(product.Name) }) %> 

io alla fine con un URL come [site-root]/Dettagli/1? slug = url-lumaca mentre io vorrei l'URL per essere più simile a [site-root]/Dettagli/1/url- slug

Can anyon e vedi dove sto andando male?

+2

Ho sempre avuto questo tipo di problema e non ho mai trovato una soluzione accettabile se non quella di codificare in modo rigido i nomi dei controller e delle azioni. Porta a MOLTI percorsi. – Will

+0

si potrebbe guardare il routing riposante per il progetto ASP.NET MVC http://stevehodgkiss.com/2009/10/11/restful-routes-for-asp-net-mvc.html Io uso questo e posso ottenere url tali come/blogs/1/posts/2/comments/3 – Paul

risposta

59

Sta utilizzando il primo percorso che è completamente soddisfatto. Prova a mettere il tuo itinerario SlugsAfterId sopra lo Default.

In pratica sta andando: "Controlla Default. Hai un'azione? Sì. Hai un ID? Sì. Usa questo e metti in pratica qualsiasi altro parametro nella QueryString".

Come nota a margine, ciò renderà il tuo itinerario Default ridondante quando fornisci un valore predefinito per il parametro slug.

31

Garry (sopra) è corretto. Puoi utilizzare il debugger di route di Mr. Haack per MVC. Può aiutare a risolvere i problemi di routing mostrandoti quali percorsi sono stati colpiti e quando.

Questo è il numero Blog Post. Ed ecco lo Zip File.

+6

+1 per il collegamento al debugger del percorso - grazie –

8

È possibile aggiungere un vincolo ai percorsi che contengono "id" poiché è presumibile che venga accettato solo un numero. In questo modo il primo percorso corrisponderà solo quando "id" è numerico, quindi renderà la seconda rotta per tutti gli altri valori. Quindi posiziona quello che include la {slug} in alto e tutto dovrebbe funzionare correttamente.

routes.MapRoute(
    "SlugsAfterId", 
    "{controller}.mvc/{action}/{id}/{slug}", 
    new { controller = "Products", action = "Browse", id = "", slug = "" }, 
    new { id = @"\d+" } 
); 

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

routes.MapRoute(
    "Tagging", 
    "{controller}.mvc/{action}/{tags}", 
    new { controller = "Products", action = "Index", tags = "" } 
);