2010-02-04 21 views
6

Tengo una ruta que tiene este aspecto:Conseguir ASP.NET MVC para escapar correctamente el # (almohadilla/libra) personaje de rutas

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

Y crear una URL utilizando esa ruta como esta:

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

sin embargo, cuando se utiliza una etiqueta con un carácter # (como "C#"), el motor de enrutamiento no se escapa de ella, por lo que obtener una URL que tiene este aspecto:

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

Lo que necesito es el # escapó de manera que se parezca a esto:

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

He intentado hacer un Url.Encode en la etiqueta antes de que entrara en la ruta, así:

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

pero eso hace que el motor de enrutamiento de escape doble del # (lo que provoca un accidente de ASP.NET con un error de solicitud malo)):

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

¿Cómo puedo obtener el motor de enrutamiento para escapar de ese carácter # para mí correc Tly?

Gracias por su ayuda con anticipación.

+2

Como nota al margen, el motor de enrutamiento está arreglado en .NET 4. Se escapará de todo lo que se le haya pasado. Si está ejecutando una aplicación MVC 2 en .NET 4, debería poder retomar este comportamiento automáticamente. – Levi

Respuesta

1

Como una solución muy calva, reemplazaría manualmente "#" con "% 23" en la salida de RouteLink. Siempre que no use fragmentos en sus urls, debería funcionar.

Puede usar expresiones regulares para aplicar solo reemplazar a la última parte de su url.

+1

Si no puedo encontrar una solución más limpia (es decir, compatible con fragmentos, funciona para todo), voy a seguir su consejo. –

+0

Como una opción, busque dentro del código fuente de RouteLink. Quizás puedas agregar una sobrecarga. Descubrí que tomar el código fuente de MVC como base para agregar un comportamiento personalizado es una gran manera de obtener exactamente lo que desea. RedirectToRoute con fragmento de soporte fue uno de ellos. –

0

Tengo un similar SO question relacionado con "/". Mientras investigaba ese problema, descubrí que ASP.NET decodifica los valores URL antes de que pasan al marco MVC, y como "#" tiene un significado especial para las URL (al igual que el "/" con el que estaba tratando) hay una buena posibilidad de que algo en el motor de enrutamiento base esté causando este comportamiento.

Al igual que Levi mencionó en su comentario, una solución es usar ASP.NET 4.0. Otra solución sería escribir un asistente de RouteLink que reemplaza automáticamente "#" con un marcador (como "! MY_HASH_TOKEN!") Y luego revertir ese reemplazo en su controlador (o tal vez a través de un HttpModule de algún tipo).

O, simplemente tire la toalla y pase el valor de la etiqueta como argumento de la cadena de consulta. No es tan sexy, pero es simple y funciona.

Cuestiones relacionadas