route net mvc httpget examples attribute asp asp.net asp.net-mvc url-routing
archivo Zip

httpget - Enrutamiento de ASP.NET MVC URL con mĂșltiples valores de ruta



route attribute asp net core (3)

Tengo problemas con Html.ActionLink cuando tengo una ruta que toma más de un parámetro. Por ejemplo, dadas las siguientes rutas definidas en mi archivo Global.asax:

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

Las dos primeras rutas funcionan sin problemas, pero cuando intento crear un enlace de acción con la tercera ruta, utilizo:

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

Terminé con una URL como [site-root] / Details / 1? Slug = url-slug mientras que me gustaría que la URL sea más parecida a [site-root] / Details / 1 / url-slug

¿Alguien puede ver dónde estoy yendo mal?


Está utilizando la primera ruta que está completamente satisfecha. Intenta poner tu ruta SlugsAfterId encima de la Default .

Básicamente va: "Verifique el valor predeterminado. ¿Tiene una acción? Sí. ¿Tiene una identificación? Sí. Use esta y elimine cualquier otro parámetro en la cadena de consulta."

Como nota al margen, hacer eso hará que su ruta Default redundante ya que proporciona un valor predeterminado para el parámetro slug .


Garry (arriba) es correcto. Puede usar el depurador de ruta del Sr. Haack para MVC. Puede ayudarlo a resolver problemas de enrutamiento mostrándole qué rutas reciben y cuándo.

Aquí está la publicación del blog . Y aquí está el archivo Zip .


Puede agregar una Restricción a sus Rutas que contenga "id", ya que se supone que es solo para aceptar un número. De esta forma, la primera ruta solo coincidirá cuando el "id" sea numérico, luego haría la segunda ruta para todos los demás valores. Luego coloque el que incluye el {slug} en la parte superior y todo debería funcionar correctamente.

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