Cambios recomendables en el retorno de helpers en MVC 2

En la versión 1.0 de MVC, lo habitual era que los métodos helpers destinados a generar código de marcado retornaran un cadena de caracteres, como en el siguiente ejemplo:

public static class Helpers
{
  public static string Image(this HtmlHelper helper, string src, string alt)
  {
    TagBuilder tb = new TagBuilder("img");
    tb.Attributes["src"] = src;
    tb.Attributes["alt"] = alt;
    return tb.ToString(TagRenderMode.SelfClosing);
  } 
}

Que podía ser utilizado desde una vista de la siguiente forma, enviándolo al cliente con un bloque de salida directa de texto:

<%= Html.Image("/img/logo.gif", "Logo") %> 

Hasta aquí todo correcto. Ahora, ASP.NET 4 ha introducido un nuevo bloque de salida de texto capaz de codificar automáticamente en HTML, lo cual ayuda a evitar ataques relacionados con la inyección de scripts:

// Lo que antes (ASP.NET < 4) era...
<%= Html.Encode(Model.FirstName) %>
 
// En ASP.NET 4 es:
<%: Model.FirstName %>

El nuevo bloque de salida codificada es el método aconsejado para emitir contenido al cliente y se espera que los desarrolladores vayamos acostumbrándonos progresivamente a utilizarlo siempre, dejando a un lado al actual antiguo <%= %>.

Esto tiene un efecto lateral no deseado cuando estamos utilizando helpers que generen HTML. Por ejemplo, si emitimos la salida del helper anterior utilizando esta nueva técnica, observad el resultado que obtendremos:

// En la vista Index.aspx:
<%: Html.Image("/img/logo.gif", "Logo") %> 
image 

La solución a este problema se consigue utilizando como tipo de retorno del helper la nueva clase MvcHtmlString, introducida en ASP.NET MVC 2, que indica explícitamente a ASP.NET que no debe codificar la salida pues se trata de una cadena HTML controlada.

Así, modificando el código del helper de la siguiente forma, obtendremos el resultado esperado:

public static class Helpers
{
  public static MvcHtmlString Image(this HtmlHelper helper, string src, string alt)
  {
    TagBuilder tb = new TagBuilder("img");
    tb.Attributes["src"] = src;
    tb.Attributes["alt"] = alt;
    return MvcHtmlString.Create(tb.ToString(TagRenderMode.SelfClosing));
  } 
}

Todos los helpers del framework  MVC destinados a generar marcado retornan ahora, en la versión 2, este nuevo tipo de datos, y esto es lo mismo que deberíamos hacer con nuestros helpers personalizados. Además, gracias a unos curiosos malabarismos realizados en el interior de MvcHtmlString, nuestros helpers funcionarán tanto con ASP.NET 3.5 SP1 como con ASP.NET 4, tanto si utilizamos salida codificada como si no.

Publicado en: Variable not found.
Hey: ¡estoy en twitter!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *