¿Qué es un MvcHtmlString y cuándo debería usarlo?

La documentación para MvcHtmlString no es terriblemente esclarecedora:

Representa una cadena codificada en HTML que no debe codificarse nuevamente.

No está claro para mí cuáles son exactamente las implicaciones de esto. Parece que algunos métodos de ayuda HTML devuelven un MvcHtmlString , pero varios ejemplos que he visto en línea de ayudantes personalizados simplemente devuelven una cadena normal.

Preguntas:

¿Qué es un MvcHtmlString ?

¿Cuándo debería elegir MvcHtmlString sobre string y viceversa? ¿Por qué?

ASP.NET 4 introduce una nueva syntax de nugget de código <%: %> . Esencialmente, <%: foo %> traduce a <%= HttpUtility.HtmlEncode(foo) %> . El equipo está intentando que los desarrolladores usen <%: %> lugar de <%= %> siempre que sea posible para evitar XSS.

Sin embargo, esto introduce el problema de que si un nugget de código ya codifica su resultado, la syntax <%: %> volverá a codificarlo . Esto se resuelve con la introducción de la interfaz IHtmlString (nueva en .NET 4). Si el foo () en <%: foo() %> devuelve un IHtmlString, la syntax <%: %> no volverá a codificarlo.

Los ayudantes de MVC 2 devuelven MvcHtmlString, que en ASP.NET 4 implementa la interfaz IHtmlString. Por lo tanto, cuando los desarrolladores usan <%: Html.*() %> En ASP.NET 4, el resultado no será doblemente codificado.

Editar:

Un beneficio inmediato de esta nueva syntax es que sus puntos de vista son un poco más limpios. Por ejemplo, puede escribir <%: ViewData["anything"] %> lugar de <%= Html.Encode(ViewData["anything"]) %> .

Esta es una respuesta tardía, pero si alguien que está leyendo esta pregunta está usando una afeitadora, lo que debe recordar es que la afeitadora codifica todo por defecto, pero al usar MvcHtmlString en sus ayudantes html puede decirle a la afeitadora que no necesita codificarlo .

Si quieres que la afeitadora no codifique una cadena, usa

 @Html.Raw("hi") 

Decompiling Raw (), nos muestra que está envolviendo la cadena en un HtmlString

 public IHtmlString Raw(string value) { return new HtmlString(value); } 

HtmlString solo existe en ASP.NET 4.

MvcHtmlString fue una compatibilidad añadida a MVC 2 para admitir .NET 3.5 y .NET 4. Ahora que MVC 3 es solo .NET 4, es una subclase bastante trivial de HtmlString, supuestamente para MVC 2-> 3, para la compatibilidad de fonts. ” fuente

Un buen uso práctico de esto es si desea crear sus propias extensiones HtmlHelper . Por ejemplo, odio intentar recordar la syntax de la etiqueta , así que he creado mi propio método de extensión para hacer una etiqueta :

  _ Public Function CssBlock(ByVal html As HtmlHelper, ByVal src As String, ByVal Optional ByVal htmlAttributes As Object = Nothing) As MvcHtmlString Dim tag = New TagBuilder("link") tag.MergeAttribute("type", "text/css") tag.MergeAttribute("rel", "stylesheet") tag.MergeAttribute("href", src) tag.MergeAttributes(New RouteValueDictionary(htmlAttributes)) Dim result = tag.ToString(TagRenderMode.Normal) Return MvcHtmlString.Create(result) End Function 

Pude haber devuelto String de este método, pero si tuviera lo siguiente se rompería:

<%: Html.CssBlock(Url.Content("~/sytles/mysite.css")) %>

Con MvcHtmlString , usar <%: ... %> o <%= ... %> funcionará correctamente.

Utilizaría un MvcHtmlString si desea pasar HTML sin formato a un método de ayuda de MVC y no desea que el método de ayuda codifique el HTML.