2010-02-19 21 views
205

El documentation para MvcHtmlString no es muy esclarecedor:¿Qué es un MvcHtmlString y cuándo debería usarlo?

Representa una cadena codificada en HTML que no debe ser codificado de nuevo.

No tengo claro 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 debo elegir MvcHtmlString sobre string y viceversa? ¿Por qué?

Respuesta

240

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

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

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á de doble codificación.

Editar:

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

+0

Agregaría que MVC 2 está compilado contra .Net 3.5, no 4. Esto significa que 'MvcHtmlString' no implementa' IHtmlString' porque eso solo existe en 4. La sintaxis '<%:' debe _duck-type_ - siempre llamará a '.ToHtmlString()' antes de '.ToString()' independientemente de la interfaz. – Keith

+1

Me corrigen - en realidad, el método 'MvcHtmlString.Create' detecta si' IHtmlString' está disponible y crea dinámicamente la clase devuelta para que sea compatible si es: http://www.windowsitpro.com/article/net-framework/Encoding -and-Strings/3.aspx – Keith

+0

sigue siendo una gran respuesta en la segunda lectura :) – melaos

6

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

+0

Hmm ... Me pareció que el punto central de un método de ayuda HTML era para codificar HTML. ¿Qué iba a hacer otra cosa con un método de ayuda HTML? – devuxer

+0

Y, además de eso, cuando iba a querer * retorno * un 'MvcHtmlString' de un método de ayuda HTML? – devuxer

+0

Pasa ao regresa de. Desea devolver uno si su ayudante de HTML genera HTML pre-escapado y no quiere que nadie más lo vuelva a escapar. – SLaks

11

Un buen uso práctico de esto es si desea hacer sus propias extensiones HtmlHelper. Por ejemplo, me gusta tratar de recordar la sintaxis <link> etiqueta, así que he creado mi propio método de extensión para hacer una etiqueta <link>:

<Extension()> _ 
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 

que podía haber vuelto String de este método, pero si tuviera la siguiente rompería:

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

Con MvcHtmlString, utilizando <%: ... %><%= ... %> o los dos para el trabajo correctamente.

70

Esta es una respuesta finales pero si cualquiera que lea esta pregunta está utilizando la maquinilla de afeitar, lo que se debe recordar es que la maquinilla de afeitar codifica todo por defecto, pero usando MvcHtmlString en sus ayudantes HTML se puede decir que la maquinilla de afeitar que no necesita para codificarlo.

Si quieres afeitar para no codificar una cadena utilizan

@Html.Raw("<span>hi</span>") 

Descompilación Raw(), nos muestra que está envolviendo la cadena en un HtmlString

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

"HtmlString sólo 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 .NET 4 solamente, es una subclase bastante trivial de HtmlString, presumiblemente para MVC 2-> 3 para la compatibilidad de fuentes. " source

Cuestiones relacionadas