2011-01-14 16 views
6

Widziałem, że IIS ma problem z dopuszczeniem dwukropków do adresów URL. Zobaczyłem także sugestie, które inni oferowali here.Colon ASP.NET MVC w URL

ze stroną pracuję, chcę, aby być w stanie przejść tytuły filmów, książek, itp, do mojego URL, okrężnicy ujęte w następujący sposób:

mysite.com/Movie/Bob:The Return 

To być spożywane przez mój MovieController, na przykład jako ciąg i używane dalej w dół linii.

Zdaję sobie sprawę, że dwukropek nie jest idealny. Czy ktoś ma jakieś inne propozycje? Tak słaba, jak obecnie, robię wyszukiwanie i zastępowanie wszystkich dwukropków (:) na inną postać, a następnie zastępowanie wstecz, gdy chcę je zużyć na końcu kontrolera.

+0

Po co używać dwukropka? Czy uważasz, że działa to na serwerach innych niż IIS? Chciałbym, żeby dwukropek nie mógł nawet określać numerów portów, ponieważ znacznie uprościłoby to przetwarzanie protokołu. Użyj łącznika, podkreślenia lub innej postaci. Lub zrób kolejny poziom, na przykład 'mysite.com/Movie/Bob/The + Return'. –

+0

Problem z wykonaniem 'mysite.com/Movie/Bob/The + Return' będzie zastanawiać się, jak zrobić tytuł filmu (" Bob: Powrót ") i wiedzieć" Hej, w tytule był dwukropek. .. Muszę złożyć to z powrotem razem. " –

+0

Może powinienem przekazać w klasie, która ma zarówno tytuł i ślimak w nim, a nie tylko tytuł filmu jako ciąg? –

Odpowiedz

3

Rozważmy URL encoding and decoding tytuły filmowe.

Można by skończyć z foo.com/bar/Bob%58The%20Return

alternatywnie rozważyć wykorzystanie jest HTML helper to remove URL unfriendly characters in URLs (metoda jest URLFriendly()). Korzyści SEO między dwukropkiem a symbolem zastępczym (na przykład kreska) byłyby prawdopodobnie pomijalne.

+9

Próbowałem kodowania/dekodowania. Wydaje się, że IIS nadal to widzi i mówi: "Hej, to wciąż okrężnica, wyrzuć 400 błędów!" –

0

Dwukropek jest zarezerwowanym i nieprawidłowym znakiem w identyfikatorze URI zgodnie z RFC 3986. Więc nie rób czegoś, co narusza specyfikację. Musisz go zakodować albo użyć innego znaku. A tutaj jest nice blog post, na który możesz rzucić okiem.

+0

Gdzie jest napisane, że jest nieważny? Czy interpretuję to niepoprawnie? pchar = niezarezerwowane/zakodowane w pct/sub-delims/":"/"@" – darkangel

0

Najprostszym sposobem jest użycie System.Web.HttpUtility.UrlEncode() podczas budowania adresu URL i System.Web.HttpUtility.UrlDecode podczas interpretacji wyników wracających. Będziesz mieć także problemy ze spacją, jeśli nie najpierw zakodujesz wartość.

2

Jednym z największych zmartwień jest to, że nazwa filmu nie zawsze będzie wyjątkowa (np. "Włoska robota"). A co z innymi niedozwolonymi znakami (np. Nawiasami itp.).

Dobrym pomysłem może być użycie numeru identyfikacyjnego w adresie URL, aby zlokalizować film w bazie danych. Nadal możesz umieścić w adresie URL przyjazną dla URL kopię nazwy filmu, ale nie musisz martwić się o powrót do oryginalnego tytułu z wszystkimi nielegalnymi znakami.

Dobrym przykładem jest adres URL tej strony. Widać, że usuwając tytuł strony nadal działa:

ASP.NET MVC Colon in URL

ASP.NET MVC Colon in URL

+0

To ciekawy pomysł. Będę musiał się nad tym zastanowić. –

6

I rozwiązany ten problem, dodając to do mojego web.config:

<httpRuntime requestPathInvalidCharacters=""/> 

ten musi znajdować się w sekcji system.Web.

Wartość domyślna to:

<httpRuntime requestPathInvalidCharacters="&lt;,&gt;,*,%,&amp;,:,\,?"/> 

Więc tylko uczynić wyjątek dla okrężnicy byłoby stać

<httpRuntime requestPathInvalidCharacters="&lt;,&gt;,*,%,&amp;,\,?"/> 

Czytaj więcej na: http://msdn.microsoft.com/en-us/library/system.web.configuration.httpruntimesection.requestpathinvalidcharacters.aspx

Przez co rozumiem postać grubego jest dopuszczalne jako niekodowana postać w adresie URL. Nie wiem, dlaczego dodali go do domyślnej requestPathInvalidCharacters.