c# - net - ¿Qué es un MvcHtmlString y cuándo debo usarlo?
curso de mvc 5 asp.net pdf (4)
La documentation para MvcHtmlString
no es terriblemente esclarecedora:
Representa una cadena codificada en HTML que no debe volver a codificarse.
No me queda claro cuáles son exactamente las implicaciones de esto. Parece que algunos métodos de ayuda HTML devuelven una MvcHtmlString
, pero varios ejemplos que he visto en línea de ayudantes personalizados solo devuelven una cadena normal.
Preguntas:
¿Qué es un MvcHtmlString
?
¿Cuándo debo elegir MvcHtmlString
sobre string
y viceversa? ¿Por qué?
ASP.NET 4 introduce una nueva sintaxis de nugget de código <%: %>
. Esencialmente, <%: foo %>
traduce a <%= HttpUtility.HtmlEncode(foo) %>
. El equipo está tratando de que los desarrolladores utilicen <%: %>
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 sintaxis <%: %>
lo volverá a codificar . Esto se resuelve con la introducción de la interfaz IHtmlString (nueva en .NET 4). Si foo () en <%: foo() %>
devuelve una IHtmlString, la sintaxis <%: %>
no la 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 utilizan <%: Html.*() %>
En ASP.NET 4, el resultado no tendrá doble codificación.
Editar:
Un beneficio inmediato de esta nueva sintaxis es que sus vistas son un poco más limpias. 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 máquina de afeitar, lo que debe recordar es que la máquina de afeitar codifica todo por defecto, pero al usar MvcHtmlString
en sus ayudantes html puede decirle a la máquina de afeitar que no es necesario que la codifique .
Si quieres que la maquinilla de afeitar no codifique un uso de cadena
@Html.Raw("<span>hi</span>")
Descompilar Raw (), nos muestra que está envolviendo la cadena en una HtmlString
public IHtmlString Raw(string value) {
return new HtmlString(value);
}
" HtmlString solo existe en ASP.NET 4.
MvcHtmlString fue un complemento de compatibilidad agregado a MVC 2 para admitir tanto .NET 3.5 como .NET 4. Ahora que MVC 3 es solo .NET 4, es una subclase bastante trivial de HtmlString presumiblemente para MVC 2-> 3 para la compatibilidad de origen. " source
Un buen uso práctico de esto es si quieres hacer tus propias extensiones HtmlHelper
. Por ejemplo, odio tratar de recordar la sintaxis de la etiqueta <link>
, 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
Podría haber devuelto String
desde este método, pero si tuviera la siguiente falla,
<%: Html.CssBlock(Url.Content("~/sytles/mysite.css")) %>
Con MvcHtmlString
, el uso de <%: ... %>
o <%= ... %>
funcionará correctamente.
MvcHtmlString
usar una MvcHtmlString
si quiere pasar HTML en bruto a un método de ayuda MVC y no quiere que el método de ayuda codifique el HTML.