9 Stimmen

Warum die Abfragezeichenfolgen in meiner ASP.NET MVC-Route?

Auf einer ASP.NET MVC (Beta)-Seite, die ich entwickle, werden manchmal Aufrufe von ActionLink URLs mit Abfragezeichenfolgen an mich zurückgegeben. Ich habe die Umstände isoliert, die dieses Verhalten hervorrufen, aber ich verstehe immer noch nicht, warum, anstatt eine saubere URL zu erzeugen, ein Abfragezeichenfolgenparameter verwendet wird. Ich weiß, dass sie funktionell das gleiche sind, aber für die Konsistenz (und das Aussehen) der URLs ist dies nicht das, was ich will.

Hier sind meine Routen:

routes.MapRoute(
    "Photo Gallery Shortcut",
    "group/{groupname}",
    new { controller = "Photos", action = "All", Id = "" });

routes.MapRoute(
    "Tagged Photos", //since the Tagged action takes an extra parameter, put it first
    "group/{groupname}/Photos/Tagged/{tagname}/{sortby}",
    new { controller = "Photos", action = "Tagged", Id = "", SortBy = "" });

routes.MapRoute(
    "Photo Gallery", //since the Gallery's defualt action is "All" not "Index" its listed seperatly
    "group/{groupname}/Photos/{action}/{sortby}",
    new { controller = "Photos", action = "All", Id = "", SortBy = "" });

routes.MapRoute(
    "Group",  //<-- "Group" Category defined above
    "group/{groupname}/{controller}/{action}/{id}",
    new {controller = "Photos", action = "Index", Id = ""});

Jetzt tritt das Problem nur auf, wenn ich die durch die Route mit dem Namen "Tagged Photos" beschriebene Ansicht betrachte und ActionLink über ausführe:

Html.ActionLink<PhotosController>(p => p.All((string)ViewData["group"], ""), "Home")

Daraus ergibt sich die URL:

http://domain/group/GROUPNAME?sortBy=

In jeder anderen Ansicht lautet die URL wie folgt:

http://domain/group/GROUPNAME

Ich habe Phil's runtergezogen ASP.NET-Routing-Debugger und alles scheint in Ordnung zu sein. Hier bin ich ratlos. Irgendwelche Ideen?

3voto

CVertex Punkte 17701

Ich weiß nicht, warum die verschiedenen Ansichten unterschiedliche URLs erzeugen.

Aber Sie können den sortBy-Parameter loswerden, indem Sie der ersten Route einen Standardwert zuweisen.

neu { sortBy = "" }

Wenn sortBy bei der Erstellung mit dem Standardwert übereinstimmt, überspringt die Routing-Engine diesen Parameter (falls er im Query-String enthalten ist).

0 Stimmen

Ah, ich habe übersehen, dass im Route Debugger die Query String URL die erste Route ausführt. Das Hinzufügen von SortBy = "" zu den Standardeinstellungen der ersten Route löst das Problem in diesem Fall, aber werde ich nicht das gleiche Problem haben, wenn ich später versuche, nach etwas Bestimmtem zu sortieren? Muss ich diese erste Route einfach entfernen?

0 Stimmen

Wenn Sie einen anderen sortBy-Wert angeben, wird der Querystring-Parameter sortBy=blah hinzugefügt.

2voto

Brad Wilson Punkte 64944

Sie müssen hier benannte Routen und keine Aktionsrouten verwenden, da das Routing in ASP.NET nach dem Prinzip "erste Übereinstimmung" und nicht nach dem Prinzip "beste Übereinstimmung" funktioniert.

0voto

Schotime Punkte 15287

Ich glaube, es ist die Abholung der ersten Route. Auch sie hat die Aktion All. Und weil das sortby nicht angegeben ist, wird es als Querystring-Parameter angezeigt

Dies funktioniert auch mit der Aktionsmethode "All" auf dem PhotosController, da der Parameter "sortby" einfach mit dem Wert der Abfragezeichenfolge gefüllt wird.

Wird im Routendebugger die 3. Route oder die 1. ausgeführt?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X