2013-04-09 6 views
9

Wenn ich auf die folgenden Stackoverflow URL navigieren http://stackoverflow.com/questions/15532493 es wird automatisch mit dem Titel der Frage, wie so angefügt:Stackoverflow-Stil URL (Customizing scheidende URL)

http://stackoverflow.com/questions/15532493/mvc-custom-route-gives-404

Das heißt, ich die URL eingeben kann in meinen Browser ohne die Frage Titel und es wird automatisch angehängt.

Wie würde ich das gleiche Ergebnis in meiner Anwendung erreichen? (Hinweis: Mir ist bewusst, dass der Fragetitel die gerenderte Seite nicht beeinflusst).

Ich habe einen Controller namens Users mit einer Aktionsmethode namens Details. Ich habe die folgende Route definiert:

Da dies eine Intranet-Anwendung ist, wird der Benutzer gegen ihre Windows-Konto authentifiziert. Ich möchte die Domäne und den Benutzernamen an die URL anhängen.

Wenn ich die URL in der Ansicht generieren, wie so:

@Html.ActionLink("Model.UserName", "Details", "User", new { domain = Model.Identity.Replace("\\", "/") }) 

ich eine URL, die wie folgt aussehen:

Domain/Benutzer/ACME/jsmith

Wenn der Benutzer jedoch über die Navigationsleiste des Browsers zur URL Domain/Users/ navigiert, stimmt er mit der Route überein und der Benutzer wird zur Seite mit den Benutzerdetails weitergeleitet. Ich möchte in diesem Fall die ACME/jsmith/ an die URL anhängen.

Die Forschung, die ich bisher getan haben zeigt, muss ich vielleicht durch Ableiten von RouteBase eine benutzerdefinierte Route Objekt implementieren und die GetRouteData und GetVirtualPath Methoden der Umsetzung, aber ich weiß nicht, wo damit beginnen (die Msdn documentaiton ist sehr dünn) .

Also, was ich möchte wissen, ist:

  1. Gibt es eine Möglichkeit, dies zu erreichen, ohne eine individuelle Route zu implementieren?
  2. Wenn nicht, kennt jemand gute Ressourcen, um mich mit der Implementierung einer benutzerdefinierten Route zu beginnen?
  3. Wenn eine benutzerdefinierte Routenimplementierung erforderlich ist, wie wird es bei der Information ankommen, die vermutlich aus der Datenbank geladen werden muss? Ist es in Ordnung, wenn ein Dienst Datenbankanrufe in einer Route tätigt (was mir falsch erscheint) oder kann die Information vom MVC-Framework an die Route weitergeleitet werden?
+1

http://stackoverflow.com/questions/25259/how-does-stackoverflow-generate-its-seo-friendly-urls –

+2

@ Soner Gönül - Die verlinkte Frage zeigt, wie man "Strings-Like-This" generiert, was ich nicht möchte. Ich möchte die Werte an die URL anhängen, wenn der Benutzer nur das 'Domain/Users'-Bit in der Navigationsleiste des Browsers eingibt. –

+1

Es ist nicht wirklich ein Duplikat, da er nicht fragt, wie man die Title-Zeichenfolge erzeugt, sondern wie man immer zu einer Seite umleitet, wo der Titel in der URL ist, auch wenn der Benutzer nur durch Eingabe der ID – tucaz

Antwort

2

Es ist eigentlich ziemlich einfach. Da der Titel nur aus SEO-Gründen da ist, muss man nicht auf die eigentliche Frage kommen, so dass der Fragen-Controller (in SO-Fall) die richtige Frage anhand der ID (in der URL) lädt und den Benutzer mit einem 301 umleitet Statuscode.

Sie dieses Verhalten mit einem beliebigen Web-Inspektor sehen

enter image description here

+0

kommt was ich ursprünglich versuchen wollte, aber es fühlte sich nicht richtig an; Ich denke, ich sollte lernen, meinen Instinkten zu vertrauen. Ich werde später testen, ob ich das funktioniere. Habe ich Recht, wenn ich denke, dass die Datenbank 2 Mal getroffen wird? –

+0

Ja, aber SO hat wahrscheinlich eine Art Caching oder Optimierung, so dass sie IDs in Fragetitel übersetzen können und die Datenbank nicht zweimal mit der vollen Auslastung erreichen. – tucaz

+0

Funktioniert perfekt. Vielen Dank. Ich bin ein bisschen unbehaglich mit dem doppelten Treffer in der Datenbank, aber ich ziehe nur eine kleine Menge an Informationen herunter und erwarte nicht irgendwo in der Nähe des Datenverkehrs von Stackoverflow, also werde ich diese Brücke überqueren und eine Zwischenspeicherungsrichtlinie implementieren, wenn sie dies tut wird ein Problem. –

1

Sie könnten es Client-Seite mit Javascript tun:

history.pushState({}, /* Title Here */, /* URL Here */); 

Einziger Nachteil ist, nicht alle Browser unterstützen es.