2013-04-09 16 views
9

Gdybym przejdź do następującego stackoverflow URL http://stackoverflow.com/questions/15532493 jest automatycznie dopisywana tytule pytanie tak:Stackoverflow styl URL (dostosowanie wychodzącego URL)

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

Oznacza to, że mogę wpisać adres URL w mojej przeglądarce bez numeru, a tytuł pytania jest dołączany automatycznie.

W jaki sposób chciałbym osiągnąć ten sam wynik w mojej aplikacji? (Uwaga: wiem, że tytuł pytania nie ma wpływu na renderowaną stronę).

Mam kontroler o nazwie Users z metodą działania o nazwie Details. Mam zdefiniowaną następującą trasę:

routes.MapRoute("UserRoute", 
    "Users/{*domain}", 
    new { controller = "User", action = "Details" }, 
    new { action = "^Details$" }); 

Ponieważ jest to aplikacja intranetowa, użytkownik jest uwierzytelniany na swoim koncie Windows. Chcę dołączyć domenę i nazwę użytkownika do adresu URL.

Gdybym wygenerować URL w widoku tak:

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

uzyskać adres URL, który wygląda tak:

domena/Users/ACME/jsmith

Jeśli jednak użytkownik przejdzie pod adres URL Domain/Users/ za pomocą paska nawigacyjnego przeglądarki, dopasuje trasę, a użytkownik zostanie przeniesiony na stronę szczegółów użytkownika. Chciałbym dodać w tym przypadku adres URL ACME/jsmith/.

Badania zrobiłem do tej pory wskazują, że mogę mieć do realizacji niestandardowych obiektów trasy poprzez wyprowadzenie z RouteBase i wdrażanie metod GetRouteData i GetVirtualPath ale nie wiem od czego zacząć z tym (the documentaiton MSDN jest bardzo cienka) .

Więc co chciałbym wiedzieć:

  1. Czy istnieje sposób na osiągnięcie tego celu bez realizacji niestandardowych trasy?
  2. Jeśli nie, czy ktoś wie o dobrych zasobach, które pozwolą mi rozpocząć wdrażanie niestandardowej trasy?
  3. Jeśli wymagana jest niestandardowa implementacja trasy, w jaki sposób uzyskuje się informacje, które prawdopodobnie muszą zostać załadowane z bazy danych? Czy jest w porządku, aby usługa wywoływała bazy danych na trasie (co wydaje mi się błędne) lub czy informacje mogą być przekazywane do trasy przez platformę MVC?
+1

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

+2

@ Soner Gönül - powiązane pytanie pokazuje "jak wygenerować-łańcuchy-jak-to", co nie jest tym, o co proszę. Chcę dodać wartości do adresu URL, jeśli użytkownik wprowadzi tylko bit 'Domain/Users /' na pasku nawigacyjnym przeglądarki. –

+1

To właściwie nie jest duplikat, ponieważ nie pyta, JAK wygenerować ciąg znaków, ale zamiast tego, jak zawsze przekierowywać na stronę, na której tytuł znajduje się w adresie URL, nawet jeśli użytkownik dostał się tam po prostu podając identyfikator – tucaz

Odpowiedz

2

To naprawdę proste. Ponieważ tytuł jest po prostu ze względów SEO, nie musisz się do właściwego pytania, więc kontroler pytań (w przypadku SO) załaduje poprawne pytanie na podstawie identyfikatora (w adresie URL) i przekieruje użytkownika z 301 Kod statusu.

Widać to zachowanie z każdym inspektora internetowej

enter image description here

+0

Dzięki, to jest co miałem zamiar wypróbować pierwotnie, ale nie czułem się dobrze; Chyba powinienem nauczyć się ufać moim instynktom. Później sprawdzę, czy mogę to sprawdzić. Czy mam rację, myśląc, że oznacza to, że baza danych zostanie trafiona 2 razy? –

+0

Tak, ale SO prawdopodobnie ma jakieś buforowanie lub optmization w miejscu, dzięki czemu mogą tłumaczyć identyfikatory do tytułów pytań i nie trafiać do bazy danych dwukrotnie z pełnym obciążeniem. – tucaz

+0

Działa idealnie. Dziękuję Ci bardzo. Trochę mi przykro z powodu podwójnego trafienia w bazę danych, ale ściągam tylko niewielką ilość informacji i nie spodziewam się, że w pobliżu ruchu Stackoverflow przekroczę ten most i zaimplementuję politykę buforowania, jeśli staje się problemem. –

1

można to zrobić po stronie klienta z javascript:

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

Jedynym minusem nie wszystkie przeglądarki obsługują go.