Пользовательский 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")
Любые идеи, что я могу делать неправильно?
Ответы
Ответ 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();