С новым Razor View Engine, должен ли мой HtmlHelpers возвращать строку или IHtmlString? - PullRequest
28 голосов
/ 04 января 2011

С помощью Razor View Engine каждый раз, когда вы выводите строку прямо на страницу, она кодируется в формате HTML. e.g.:

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

фактически получит вывод на страницу в виде:

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

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

Hello World

Вот проблема, хотя при создании 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 Ответ

40 голосов
/ 04 января 2011

В большинстве случаев вы должны вернуть экземпляр 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.

...