net mvc htmlhelper how custom create asp.net-mvc asp.net-mvc-3 html-helper

asp.net mvc - mvc - Custom HtmlHelper Renders Text y no Markup



htmlhelper c# mvc (4)

Aquí está una respuesta para el año 2018 trabajando con .Net Core 2

using Microsoft.AspNetCore.Html; using Microsoft.AspNetCore.Mvc.Rendering; using System.IO; public static IHtmlContent HelloWorld(this IHtmlHelper html, string name) { var span = new TagBuilder("span"); span.InnerHtml.Append("Hello, " + name + "!"); var br = new TagBuilder("br") {TagRenderMode = TagRenderMode.SelfClosing}; string result; using (var writer = new StringWriter()) { span.WriteTo(writer, System.Text.Encodings.Web.HtmlEncoder.Default); br.WriteTo(writer, System.Text.Encodings.Web.HtmlEncoder.Default); result = writer.ToString(); } return new HtmlString(result); }

He escrito un básico HtmlHelper. Aquí hay una prueba que escribí que simplifica lo que estaba haciendo y me da seguridad de que está sucediendo cuando uso los objetos StringBuilder y TagBuilder :

public static string HelloWorld(this HtmlHelper htmlHelper, string name) { var sb = new StringBuilder(); var builder = new TagBuilder("span"); builder.InnerHtml = "Hello, " + name + "!"; sb.Append(builder.ToString(TagRenderMode.Normal)); sb.Append("<br/>"); return sb.ToString(); }

La salida de este control codifica la cadena, así que veo lo siguiente: <span>Hello, Jason!</span><br/>

En mi opinión, estoy usando lo siguiente: @Html.HelloWorld("Jason")

¿Alguna idea de lo que puedo estar haciendo mal?


El motor de Razor se escapa de HTML por defecto en las cadenas que representa. Si cambia el tipo de retorno a IHtmlString , esto no sucederá.

public static IHtmlString HelloWorld(this HtmlHelper htmlHelper, string name) ... return new HtmlString(sb.ToString()); }


Su método estático debe ser HtmlString lugar de una string , y debe devolver HtmlString(sb.ToString());

public static HtmlString HelloWorld(this HtmlHelper htmlHelper, string name) { var sb = new StringBuilder(); var builder = new TagBuilder("span"); builder.InnerHtml = "Hello, " + name + "!"; sb.Append(builder.ToString(TagRenderMode.Normal)); sb.Append("<br/>"); return new HtmlString(sb.ToString()); }


Utilice AppendFormat lugar de Append

var sb = new StringBuilder(); var builder = new TagBuilder("span"); builder.InnerHtml = "Hello, " + name + "!"; sb.AppendFormat(builder.ToString(TagRenderMode.Normal)); sb.AppendFormat("<br/>"); return sb.ToString();