2011-05-05 24 views
7

tengo el siguiente código en mi opinión:Cómo URL parámetros codificar en ASP .NET MVC

<%= Html.ActionLink(
      "View item", 
      "Index", 
      "Items", 
      new 
      { 
       itemName = Model.ItemName 
      }, 
      null) %> 

Tengo un problema cuando el nombre del elemento contiene un sostenido (#) o el símbolo de porcentaje (%) .

  • Cuando el nombre del artículo es "name#with#sharp#", el controlador recibe sólo la primera parte del nombre hasta que la primera agudo (sólo recibe "name").

  • Cuando el nombre del artículo es "name%with%percent" me aparece un error: HTTP error 400 - Solicitud incorrecta.

No estoy seguro si esto es un problema con la codificación URL, ya que funciona con otros caracteres conflictivos como:

; 
= 
+ 
, 
~ 
[blank] 

¿Sabe usted cómo podría yo hacer frente a este problema?

Gracias de antemano.

+0

¿Qué URL se están generando? Cuando pruebo el ejemplo anterior con los símbolos '%', obtengo esto: 'http: // localhost/AspNetMvc2/Items? ItemName = name% 25with% 25percent', y no hay errores. Además, el ejemplo con el símbolo '#' produce esto: 'http: // localhost: 55386/Items? ItemName = name% 23with% 23sharp% 23' –

Respuesta

11

Estoy suponiendo que tiene una configuración de ruta y su URL tiene la siguiente apariencia:

http://localhost/Items/Index/name%25with%25percent - (esto va a explotar)

en contraposición a esto:

http://localhost/Items/Index/?itemName=name%25with%25percent - (consulta string está bien)

Así que una opción sería eliminar la propiedad "itemName" de su ruta (en su RouteCollection) para que Html.ActionLink represente la Url usando itemName como un parámetro QueryString.

Como dice @Priyank, el problema se debe a que el itemName es parte de la Url (no es un parámetro QueryString) y contiene caracteres ilegales.

+0

Sí, está asumiendo que está bien. Entonces, el único lugar para usar% symbol es una cadena de consulta. ¿Hay alguna otra forma de usar% en la URL? –

0

Debería poder utilizar la instancia de su vista de UrlHelper para hacer esto por usted. Trate de darle a este un tiro:

<%= Html.ActionLink( "View item", "Index", "Items", new { itemName = Url.Encode(Model.ItemName) }, null) %>

actualización

Después de las pruebas, parece codificar explícitamente como lo hice anteriormente parece ser menos precisa y hará que el servidor de doble codificación (por ejemplo,% saldrá como% 2525 en la url).

+1

Esto no es suficiente. IIS está convirtiendo nombre + hello en nombre% 25% 2bhello que falla con una solicitud incorrecta –

+0

Me sale bien si codigo o no. 200 código de estado en general. En realidad parece más preciso cuando ** no ** codigo, y solo dejo que el enrutamiento y el IIS hagan lo suyo normalmente. Acabo de probar en Casini e IIS Express con su url con ejemplos de objetos punzantes (#), porcentajes (%) y más (+). ¿Qué versión de IIS estás usando? – JasonOffutt

+1

para reproducir el problema, tendrá que configurar una ruta con un token llamado itemName, por lo que la url tiene el siguiente aspecto: localhost/Items/Index/name% 25with% 25percent - esta url contiene caracteres ilegales –

4

Dado que estos valores enrutados se publican como parte de una cadena de URL, se tratarán como valores separados, separados por # y%. Hay dos opciones para manejar su caso.

Tendrá que implementar su ValueProvider (IValueProvider and especially RouteDataValueProvider) personalizado para manejar sus necesidades personalizadas. Un programador tuvo un problema con el carácter '/' y lo hackeó aquí http://mrpmorris.blogspot.com/2012/08/asp-mvc-encoding-route-values.html

En segundo lugar es almacenar los valores en TempData que persisten en dos solicitudes y usarlas.

Espero que esto ayude a pensar en la dirección correcta.

Cuestiones relacionadas