2010-02-04 8 views
6

mam trasę, która wygląda tak:Pierwsze ASP.NET MVC poprawnie ucieC# (hash/funt) charakter w trasach

routes.MapRoute(
"BlogTags", 
"Blog/Tags/{tag}", 
new { controller = "Blog", action = "BrowseTag", viewRss = false } 
); 

I stworzyć URL przy użyciu tej trasy tak:

<%= Html.RouteLink(Html.Encode(sortedTags[i].Tag), 
     new { action = "BrowseTag", tag = sortedTags[i].Tag })%> 

jednak, gdy używany jest znak z charakterem # (na przykład „C#”), silnik routingu nie uciec, więc mogę dostać adres URL, który wygląda tak:

<a href="/Blog/Tags/C#">C#</a> 

Co potrzebne jest # uciekł tak, że wygląda tak:

<a href="/Blog/Tags/C%23">C#</a> 

Próbowałem robić Url.Encode na metce, zanim udał się na trasie, tak:

<%= Html.RouteLink(Html.Encode(sortedTags[i].Tag), 
     new { action = "BrowseTag", tag = Url.Encode(sortedTags[i].Tag) })%> 

ale to sprawia, że ​​silnik routingu podwójne ucieC# (który powoduje awarię ASP.NET z bad request Error)):

<a href="/Blog/Tags/C%2523">C#</a> 

Jak mogę dostać silnik routingu, aby uciec, że znak # dla mnie correc Tly?

Dziękuję za pomoc z góry.

+2

Na marginesie, silnik routingu jest naprawiony w .NET 4. Ucieknie wszystko, co do niego dotarło. Jeśli korzystasz z aplikacji MVC 2 na platformie .NET 4, powinieneś być w stanie automatycznie wykryć to zachowanie. – Levi

Odpowiedz

1

Jako rozwiązanie bardzo łysiące, ręcznie zamieniłbym "#" na "% 23" na wyjściu RouteLink. Pod warunkiem, że nie używasz fragmentów w swoich adresach URL, powinno działać.

Możesz użyć wyrażenia regularnego, aby zastosować tylko zastąpienie ostatniej części adresu URL.

+1

Jeśli nie znajdę rozwiązania czystszego (tj. Wspierającego fragmenty, działa na wszystko), całkowicie skorzystam z twojej porady. –

+0

Opcjonalnie zajrzyj do kodu źródłowego RouteLink. Może możesz dodać przeciążenie. Odkryłem, że przyjęcie kodu źródłowego MVC jako podstawy do dodania niestandardowego zachowania jest świetnym sposobem na uzyskanie dokładnie tego, co chcesz. RedirectToRoute z obsługą fragmentów było jednym z nich. –

0

Mam similar SO question dotyczące "/". Podczas badania tego problemu dowiedziałem się, że ASP.NET dekoduje wartości adresów URL przed są przekazywane do struktury MVC, a ponieważ "#" ma specjalne znaczenie dla adresów URL (podobnie jak "/", z którym miałem do czynienia) jest dobry szansa, że ​​coś w podstawowym silniku routującym powoduje takie zachowanie.

Podobnie jak wspomniany Levi w swoim komentarzu, jednym z rozwiązań jest użycie ASP.NET 4.0. Innym rozwiązaniem byłoby napisanie helpera RouteLink, który automatycznie zastąpi "#" jakimś znacznikiem (np. "! MY_HASH_TOKEN!"), A następnie odwróci ten zamiennik w kontrolerze (lub może poprzez jakiś HttpModule jakiegoś rodzaju).

Albo po prostu wrzuć ręcznik i podaj wartość tagu jako argument zapytania. Nie tak seksowne, ale proste i działa.