taghelper que pages net for code asp c# asp.net-mvc razor html-encode

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:

&lt;p&gt;Hello World &lt;/p&gt;

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.