Ich habe Probleme mit Html.ActionLink, wenn ich eine Route habe, die mehr als einen Parameter akzeptiert. Angenommen, die folgenden Routen sind in meiner Datei "Global.asax" definiert:
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 = "" }
);
Die ersten beiden Routen funktionieren problemlos, aber wenn ich versuche, einen Aktionslink zur dritten Route zu erstellen, verwenden Sie:
<%= Html.ActionLink(Html.Encode(product.Name), "Details", new { id = product.ProductId, slug = Html.Encode(product.Name) }) %>
Ich erhalte eine URL wie [Site-Root]/Details/1? Slug = URL-Slug, während ich möchte, dass die URL eher [Site-Root]/Details lautet/1/url-slug
Kann jemand sehen, wo ich falsch liege?
Es wird die erste Route verwendet, die voll zufrieden ist. Versuchen Sie, Ihre SlugsAfterId
-Route über die Default
-Route zu setzen.
Grundsätzlich heißt es: "Check Default. Eine Aktion? Ja. Eine ID? Ja. Verwenden Sie diese und geben Sie andere Parameter in den Querystring ein."
Wenn Sie dies tun, wird Ihre Default
-Route überflüssig, da Sie einen Standardwert für den Parameter slug
angeben.
Sie können Ihren Routen eine Einschränkung hinzufügen, die "id" enthält, da vermutlich nur eine Zahl akzeptiert werden muss. Auf diese Weise stimmt die erste Route nur dann überein, wenn die "id" numerisch ist, dann würde sie die zweite Route für alle anderen Werte bilden. Platzieren Sie dann die mit der {Schnecke} oben und alles sollte korrekt funktionieren.
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 = "" }
);