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();