2010-02-04 8 views
6

ich eine Route haben, um richtig zu entkommen, der wie folgt aussieht:Erste ASP.NET MVC der # (Hash/pound) Zeichen in Routen

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

Und ich erstellen eine URL, die Route wie folgt aus:

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

wenn jedoch ein Tag mit einem # Zeichen (wie "C#") verwendet wird, wird das Routing-Engine entkommt es nicht, so dass ich eine URL, die wie folgt aussieht:

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

Was ich brauche, ist die # entkommen, so dass es wie folgt aussieht:

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

Ich versuchte, ein Url.Encode auf dem Tag zu tun, bevor es in die Strecke ging, wie folgt aus:

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

aber das macht das Routing-Engine der doppelte # entkommen (die mit einem schlechten Anforderungsfehler einen ASP.NET-Absturz verursacht)):

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

Wie kann ich das Routing-Engine bekomme für mich das Zeichen # zu entkommen correc tally?

Vielen Dank für Ihre Hilfe im Voraus.

+2

Als Randbemerkung ist die Routing-Engine in .NET 4 behoben. Es wird alles, was an es übergeben wird entkommen. Wenn Sie eine MVC 2-Anwendung unter .NET 4 ausführen, sollten Sie dieses Verhalten automatisch erkennen können. – Levi

Antwort

1

Als eine sehr glatzköpfige Lösung würde ich manuell "#" durch "% 23" in der Ausgabe von RouteLink ersetzen. Vorausgesetzt, Sie verwenden keine Fragmente in Ihren URLs, sollte es funktionieren.

Sie könnten regulären Ausdruck verwenden, um nur den letzten Teil der URL zu ersetzen.

+1

Wenn ich keine sauberere Lösung (dh Fragment-Unterstützung, funktioniert für alles) finden kann, werde ich Ihren Ratschlag vollständig übernehmen. –

+0

Schauen Sie sich als Option den Quellcode von RouteLink an. Vielleicht können Sie eine Überladung hinzufügen. Ich habe festgestellt, dass die Verwendung des Quellcodes von MVC als Grundlage für das Hinzufügen von benutzerdefiniertem Verhalten eine großartige Möglichkeit ist, genau das zu erreichen, was Sie möchten. RedirectToRoute mit Fragmentunterstützung war einer von ihnen. –

0

Ich habe eine similar SO question in Bezug auf "/". Bei der Untersuchung dieses Problems habe ich gelernt, dass ASP.NET die URL-Werte vor dekodiert und an das MVC-Framework übergeben wird, und da "#" eine besondere Bedeutung für URLs hat (genau wie das "/"), gibt es ein gutes Möglichkeit, dass etwas in der Basis-Routing-Engine dieses Verhalten verursacht.

Wie Levi in ​​seinem Kommentar erwähnt, ist eine Lösung, ASP.NET 4.0 zu verwenden. Eine andere Lösung wäre, einen RouteLink-Helper zu schreiben, der "#" automatisch durch einen Marker (wie "! MY_HASH_TOKEN!") Ersetzt und dann diesen Ersatz in Ihrem Controller umkehrt (oder vielleicht über ein HttpModule irgendeiner Art).

Oder werfen Sie einfach das Handtuch und übergeben Sie den Tag-Wert als Querystring-Argument. Nicht so sexy, aber es ist einfach und es funktioniert.