wake-up-neo.com

ASP.NET MVC-URL-Routing mit mehreren Routenwerten

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?

50
Ian Oxley

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.

60
Garry Shutler

Garry (oben) ist richtig. Sie können den Routendebugger von Herrn Haack für MVC verwenden. Sie können Routing-Probleme beheben, indem Sie anzeigen, welche Routen wann betroffen sind.

Hier ist das Blog Post . Und hier ist die Zip-Datei .

32
MunkiPhD

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