ASP.NET MVC - Mapping mehr als eine Abfrage-String-Parameter auf einen ziemlich url
-
03-07-2019 - |
Frage
Ich bin ein bisschen auf die Gestaltung meiner SEO-freundliche URLs für mvc stecken .... Nehmen Sie zum Beispiel die folgende URL ein: http: //myapp/venues/resturants.aspx location = central & orderBy = top- bewertet
Mit meiner MVC-app ich habe es wie folgt abgebildet:
http: // myapp / Veranstaltungsorte / Liste / resturants / zentral / top-rated
{Controller} / {Aktion} / {Kategorie} / {Lage} / {um}
Jetzt ist das einzige Problem ist, dass Lage und Ordnung sind optional ... so sollte es möglich sein eine Anfrage wie einreichen: http: // myapp / Veranstaltungsorte / Liste / resturants / top-rated . Dies beweist, um ein Problem zu sein, wenn die Anforderung die Controller-Aktion trifft, hat der Lageparameter „top-rated“ aufgenommen, natürlich.
Irgendwelche Vorschläge? Ich bin am überlegen explizite querystrings mit mehr als einem Parameter zu behandeln, aber das ist wirklich meine letzte Option, da ich möchte nicht zu viel SEO opfern.
Hat jemand Éles in solche Dilemmas laufen? Und wie Sie damit umgegangen?
Vielen Dank im Voraus!
Lösung
Unter der Annahme, dass die zulässigen Werte für die Lage und Reihenfolge eindeutig sind (dh, wenn sie hereinkommen, Sie sagen, sie auseinander, oder sonst, wenn sie nur einen liefern, wie wollen Sie wissen, ob es einen Ort oder eine Bestellung ist?) , dann könnte man nur zwei Parameter nehmen und herausfinden, was sie in der Steuerung sind.
Route: {controller}/{action}/{param1}/{param2}
Controller Aktion:
public ActionResult MyAction(string param1, string param2)
{
string location;
string order;
if (!ParseLocation(param1, out location))
{ ParseLocation(param2, out location); }
// ...
}
Nicht besonders elegant, aber nicht lassen Sie die URLs, die Sie wollen.
Andere Tipps
Klicken Sie auf Profil Link und schauen Sie sich die URLs für Statistik, Neu, Antwort, etc.
Beispiele:
- https://stackoverflow.com/users/52065?sort=recent#sort-top
- https://stackoverflow.com/users/52065?sort=stats#sort-top
ohne Art wird standardmäßig Statistiken
Optional paramters sollte Abfrageparameter
seinSie werden immer dieses Problem haben, wenn Sie mehrere optionale Parameter haben. Entweder macht eine oder beide nicht-optional (und früher in dem Query-String als die optional ein positioniert) oder verwenden Sie die Abfragezeichenfolgeflag Parameter Notation.
ok Jungs nur eine Lösung Entsendung i mit bisher habe zu spielen.
Ich habe meine Wege mit Einschränkungen wie folgt festgelegt:
routes.MapRoute(
"VenuesList",
"venues/list/{category}/{location}/{orderBy}",
new { controller = "venues", action = "list", category = "", location = "", orderBy = "" },
new { location = "central|east|west|south", orderBy = "top-rated|price" }
);
routes.MapRoute(
"VenuesListByLocation",
"venues/list/{category}/{location}",
new { controller = "venues", action = "list", category = "", location = "" },
new { location = "central|east|west|south" }
);
routes.MapRoute(
"VenuesListByOrder",
"venues/list/{category}/{orderBy}",
new { controller = "venues", action = "list", category = "", orderBy = "" },
new { orderBy = "top-rated|price" }
);
routes.MapRoute(
"VenuesListDefault",
"venues/list/{category}",
new { controller = "venues", action = "list", category = "" }
);
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
Die Idee ist, dass, wenn die Validierung fehlschlägt es auf die nächste Route in der Liste gehen ... schließlich den Standard schlagen.
Benötigt etwas mehr Tests aber hat gut funktioniert so weit ...
Warum nicht eine Eigenschaft auf der Seite für jede mögliche Abfragezeichenfolgeflag Parameter erstellen?
Auf diese Weise können Sie es jede mögliche Weise behandeln Sie mit nur wenigen Zeilen Code wählen ...