Пользовательский HtmlHelper отображает текст, а не разметку - PullRequest
18 голосов
/ 05 августа 2011

Я написал базовый HtmlHelper. Вот тест, который я написал, который упрощает то, что я делал, и обеспечивает уверенность в том, что это происходит, когда я использую StringBuilder и 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();
}

Выходные данные для этого элемента управления кодируют строку, поэтому я вижу следующее: <span>Hello, Jason!</span><br/>

На мой взгляд, я использую следующее: @Html.HelloWorld("Jason")

Есть идеи, что я могу делать не так?

Ответы [ 4 ]

23 голосов
/ 05 августа 2011

Механизм Razor по умолчанию экранирует HTML во всех отображаемых строках. Если вы измените тип возврата на IHtmlString, этого не произойдет.

public static IHtmlString HelloWorld(this HtmlHelper htmlHelper, string name)
    ...
    return new HtmlString(sb.ToString());
}
3 голосов
/ 05 августа 2011

Ваш статический метод должен быть HtmlString вместо string, и вы должны вернуть 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());
}
1 голос
/ 05 августа 2011

Используйте AppendFormat вместо 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();
0 голосов
/ 08 августа 2018

Вот ответ за 2018 год работы с .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);
}
...