2010-05-24 10 views
7

Estoy usando Url.Action para generar una URL con dos parámetros de consulta en un sitio que tiene un doctype de XHTML estricto.Método integrado para codificar ampersands en las URL devueltas desde Url.Action?

Url.Action("ActionName", "ControllerName", new { paramA="1" paramB="2" }) 

genera:

/ControllerName/ActionName/?paramA=1&paramB=2 

pero necesito que genere la URL con el símbolo de unión escaparon:

/ControllerName/ActionName/?paramA=1&paramB=2 

El hecho de que Url.Action está devolviendo el URL con el símbolo de unión no escapado rompe mi validación de HTML. Mi solución actual es simplemente reemplazar manualmente el signo & en la URL devuelta desde Url.Acción con un símbolo de escape. ¿Hay una solución integrada o mejor para este problema?

Respuesta

0

Acabé la creación de extensiones para Url.Action llama Url.ActionEncoded. El código es el siguiente:

namespace System.Web.Mvc { 
    public static class UrlHelperExtension { 
     public static string ActionEncoded(this UrlHelper helper, StpLibrary.RouteObject customLinkObject) { 
      return HttpUtility.HtmlEncode(helper.Action(customLinkObject.Action, customLinkObject.Controller, customLinkObject.Routes)); 
     } 
     public static string ActionEncoded(this UrlHelper helper, string action) { 
      return HttpUtility.HtmlEncode(helper.Action(action)); 
     } 
     public static string ActionEncoded(this UrlHelper helper, string action, object routeValues) { 
      return HttpUtility.HtmlEncode(helper.Action(action, routeValues)); 
     } 
     public static string ActionEncoded(this UrlHelper helper, string action, string controller, object routeValues) { 
      return HttpUtility.HtmlEncode(helper.Action(action, controller, routeValues)); 
     } 
    } 
} 
1

algún motivo no se puede utilizar Server.HtmlEncode()

string EncodedUrl = Server.HtmlEncode(Url.Action("Action", "Controller", new {paramA = "1", paramB = "2"})); 

http://msdn.microsoft.com/en-us/library/w3te6wfz.aspx

+0

que estaba esperando desde hace algún ajuste de configuración que permitiría Url.Action para hacer automáticamente esto por mí, pero esto es definitivamente mejor que simplemente reemplazar manualmente el signo y. – Blegger

0

Parece que tiene un problema con la prestación de un URL, no la generación de la URL. Una URL puede tener un ampersand no codificado y hay lugares que pueden ser exactamente lo que necesita. El código HTML en el que lo está incorporando en este caso, sin embargo, quiere ampersands y varios otros caracteres codificados.

Mientras que un método auxiliar ahorraría algo de tipeo en las vistas, siempre me ahorra dolores de cabeza tener la codificación de la pantalla en el último momento posible, así que siempre estoy trabajando con la cadena/URL original hasta el punto I necesitarlo manipulado para usar en un formato de salida particular. Si coloca la extensión de ayuda desde your answer en HtmlHelper, tendrá menos la tentación de codificar prematuramente su URL antes de que realmente se necesite.

Para decirlo prima en HTML:

// with MVC3 auto-encoding goodness 
<%:Url.Action(...)%> 
// old-school MVC 
<%=Html.Encode(Url.Action(...))%> 

Para ponerlo en un ancla/src atribuye directamente en una vista, que probablemente podría salirse con la Html.Encode o la opción menos estricta:

<%=Html.AttributeEncode(Url.Action(...))%> 
7

Esto funcionó para mí:

Html.Raw(Url.Action("ActionName", "ControllerName", new { paramA="1" paramB="2" })) 
+0

Html.Raw es en realidad para escapar de la codificación obligatoria de @Razor. –

Cuestiones relacionadas