Laden...

ASP.NET MVC UrlRouting - Schöne Urls

Erstellt von ben vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.249 Views
B
ben Themenstarter:in
200 Beiträge seit 2006
vor 12 Jahren
ASP.NET MVC UrlRouting - Schöne Urls

Hallo zusammen,

überall wird geprisen, das ASP.NET MVC mit dem UrlRouting schöne (SEO-Friendly) Urls bietet. Auch habe ich in bisherigen Beispiel-Anwendungen keine anspurchsvolleren Routes als die Default ({controller}/{action}/{id}) gesehen.

Meiner Ansicht nach sind Urls wie "/Home/Index" oder sonstige "/Entry/Detail/1000/Titel-des-Eintrags" ({controller}/{action}/{id}/{title}) nicht unbedingt schön.

  1. Schreibt Ihr dafür (Eintrag Detailansicht; Listenansicht z.B. Einträge aus Kategorie) eigene RouteContraints, welche dann auf die Index (oder sonstige) ActionMethod des jeweiligen Controllers zeigen (ControllerName/ActionName sind dann nicht mehr in der Url sichtbar)?

  2. Wenn nun eigene RouteContraints definiert und registriert wurden (die Defaultroute "{controller}/{action}/{id}" entfernt wurde), brauche ich dann für jede weitere ActionMethod des jeweiligen Controllers einen eigenen RouteConstraint? Intern kann ich in der View dann leider keine einfachen @Html.Action(actionName, ControllerName) mehr aufrufen....

Irgenswie scheint mir das so recht undurchsichtig zu werden.

  1. Wie geht Ihr mit deutschsprachigen Urls z.B. die Seite "/Kontakt" um. Nennt Ihr dann die ActionMethod "Kontakt" (Finde ich persönlich sehr unschön, deutsche Englisch im Code zu mischen) bzw. das Attribute [ActionNameAttribute("Kontakt")] (schon besser) bzw. die gleiche Frage mit den Views?
G
538 Beiträge seit 2008
vor 12 Jahren

Hallo,

zu schön oder unschön sage ich nichts und auch zu SEO-Friendly oder nicht kann ich nichts sagen,
aber was ich dir sagen kann ist folgendes:

/Entry/Detail/100/Titel-des-Eintrags könntest du auch anders ersetzen, nämlich zum Beispiel mit sowas wie Eintrag/Titel-des-Eintrags-1000 - du musst die Parameter nämlich nicht durch / abtrennen.

zu 1)
Nein - warum sollte man ein Constraint anlegen für die Action? Wenn jemand eine Action will, die nicht existiert - bekommt er sie sowieso nciht.
Constraints sind sinnvoll um zum Beispiel Datenformate abzuprüfen (zum Beispiel könnte id eine gültige GUID sein müssen).

zu 2)
Route Constraints sind Regex du kannst also, falls du deine Actions in die Constraints schreiben willst sowas wie (Action1|Action2|Action[0-9]) schreiben.

zu 3)
Du kannst über die Implementierung bestimmter Klassen (ich weiß nicht welche, aber auf Google gibts beispiele) bestimmen, wie die Action ausgewählt wird. Wenn du dort eine Übersetzungstabelle zwischenschaltest, kannst du es auch Lokalisieren.
Du könntest auch Lokalisierte Klassennamen erzeugen, die einfach nur auf das orginial Weiterleiten (eher quick'n'dirty).
Bei Views kannst du die einfach sowas wie View.de-De.cshtml erzeugen, oder das normale Ressoucensystem benutzen.

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)

16.834 Beiträge seit 2008
vor 12 Jahren

Ich füge nur noch hinzu, da Grumbler im großen und ganzen die wichtigsten Punkte genannt hat.

zu 1)
Ich schreibe für jede Action, die ich habe und häufig verwende eine eigene Route-Definition.
Zum einen, um schöne Urls / Breadcrumbs erstellen zu können und zum anderen, weil Url.RouteUrl() performanter als Url.Action() ist. Das hat den Grund, dass RouteUrl nicht suchen muss. Der Faktor liegt hier bei circa 7 ( hab ich irgendwo hier im Forum mal aufgezeigt ).

zu 2) Willst Du nur eine Partial-Views anzeigen, so bietet sich an, mit Html.Partial("~/Area..../..../Views/Home/Index.cshtml") zu arbeiten - auch dies ist schneller, da ansonsten pro Aufruf bis zu 10 Exceptions intern beim Suchen nach der View verarbeitet werden müssen.

Willst Du unbedingt mit Actions arbeiten, so nutze das von Dir genannte ActionName-Attribut. Der ActionName ist nur für interne verweise, und wird nicht nach außen getragen; ergo keine Lokalisierung notwendig. Auf eine Abkopplung bist Du schließlich irgendwie angewiesen.