que - razor pages c#
Con el nuevo Razor View Engine, ¿deberían mis HtmlHelpers devolver string o IHtmlString? (1)
En la mayoría de los casos, debe devolver una instancia de IHtmlString
. Ese es el patrón seguido por los helpers integrados * y significa que el consumidor de un ayudante no necesita preocuparse por una codificación insuficiente o excesiva.
En lugar de usar la función Raw
, probablemente solo deba devolver una nueva instancia de HtmlString
.
public static IHtmlString MyCoolHelperMethod(this HtmlHelper helper) {
return new HtmlString("<p>Hello World</p>");
}
* Tenga en cuenta que MVC 3 realmente usa MvcHtmlString
como el tipo de retorno de sus helpers, pero esto es un remanente de MVC 2 días. (Historia complicada, pero en resumen, IHtmlString
solo se introdujo en .NET 4 y desde que MVC 2 MvcHtmlString
.NET 3.5, se introdujo el tipo MvcHtmlString
como un paso intermedio). Todos los helpers que apuntan a MVC 3 y superior deben devolver IHtmlString
.
Con Razor View Engine, cada vez que saca una cadena directamente a la página, está codificada en HTML. p.ej:
@"<p>Hello World</p>"
en realidad obtendrá salida a la página como:
<p>Hello World </p>
Que aparecería en el navegador como:
<p> Hola mundo </ p>
Este es el problema, sin embargo, al crear Html helpers, hasta ahora, con el antiguo motor de vista aspx, simplemente devolvía una cadena y la enviaba al navegador:
<%= Html.MyCoolHelperMethod(); %>
Entonces mi pregunta es básicamente esto. ¿Hago esto?
public static IHtmlString MyCoolHelperMethod(this HtmlHelper helper)
{
return new helper.Raw("<p>Hello World</p>");
}
en cuyo caso puedo hacer esto en mi cshtml:
@Html.MyCoolHelperMethod();
o hago esto:
public static string MyCoolHelperMethod(this HtmlHelper helper)
{
return "<p>Hello World</p>";
}
en cuyo caso necesito hacer el trabajo en mi cshtml:
@Html.Raw(Html.MyCoolHelperMethod());
Obviamente, el primer enfoque hace que la vista se vea mucho más limpia, pero me pregunto si el patrón común es que los ayudantes devuelvan un IHtmlString
y lo he estado haciendo mal en el pasado.