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

С новым Razor View Engine, должен ли мой HtmlHelpers вернуть строку или IHtmlString?

С Razor View Engine, когда вы выведете строку непосредственно на страницу, она закодирована в HTML. например:.

@"<p>Hello World</p>"

на самом деле будет выводиться на страницу следующим образом:

&lt;p&gt;Hello World &lt;/p&gt;

Что будет отображаться в браузере как:

<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, и я делал это неправильно в прошлом.

4b9b3361

Ответ 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.