Подтвердить что ты не робот

Пользовательский HtmlHelper визуализирует текст, а не разметку

Я написал базовый 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")

Любые идеи, что я могу делать неправильно?

4b9b3361

Ответ 1

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

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

Ответ 2

Ваш статический метод должен быть 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());
}

Ответ 3

Используйте 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();