С новым Razor View Engine, должен ли мой HtmlHelpers вернуть строку или IHtmlString?
С Razor View Engine, когда вы выведете строку непосредственно на страницу, она закодирована в HTML. например:.
@"<p>Hello World</p>"
на самом деле будет выводиться на страницу следующим образом:
<p>Hello World </p>
Что будет отображаться в браузере как:
<p> Hello World </p>
Здесь проблема, однако, при создании Html-помощников, до сих пор, с помощью старого механизма просмотра aspx я бы просто вернул строку и вывел ее в браузер:
<%= Html.MyCoolHelperMethod(); %>
Итак, мой вопрос в основном таков. Я делаю это:
public static IHtmlString MyCoolHelperMethod(this HtmlHelper helper)
{
return new helper.Raw("<p>Hello World</p>");
}
В этом случае я могу просто сделать это в моем cshtml:
@Html.MyCoolHelperMethod();
или я делаю это:
public static string MyCoolHelperMethod(this HtmlHelper helper)
{
return "<p>Hello World</p>";
}
В этом случае мне нужно выполнить работу в моем cshtml:
@Html.Raw(Html.MyCoolHelperMethod());
Очевидно, что первый подход делает просмотр намного более чистым, но мне просто интересно, действительно ли общий паттерн для помощников возвращает IHtmlString
, и я делал это неправильно в прошлом.
Ответы
Ответ 1
В большинстве случаев вы должны вернуть экземпляр IHtmlString
. Это шаблон, за которым следуют встроенные помощники *, а это значит, что потребителю помощника не нужно беспокоиться о недо- или чрезмерном кодировании.
Вместо использования функции Raw
вы, вероятно, должны просто вернуть новый экземпляр HtmlString
.
public static IHtmlString MyCoolHelperMethod(this HtmlHelper helper) {
return new HtmlString("<p>Hello World</p>");
}
* Обратите внимание, что MVC 3 фактически использует MvcHtmlString
как возвращаемый тип своих помощников, но это перерыв в MVC за 2 дня. (Сложная история, но, короче говоря, IHtmlString
была введена только в .NET 4, и поскольку MVC 2 поддерживал .NET 3.5, тип MvcHtmlString
был представлен как промежуточный шаг). Все помощники, нацеленные на MVC 3 и выше, должны возвращать IHtmlString
.