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