Должен ли мой HtmlHelpers возвращать строку или IHtmlString с новым механизмом просмотра Razor?

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

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

фактически будет выводиться на страницу как:

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

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

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


person BFree    schedule 04.01.2011    source источник
comment
Посмотрите на это: stackoverflow.com/questions/2293357/ Вы должны вернуть IHtmlString   -  person LukLed    schedule 04.01.2011


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

person marcind    schedule 04.01.2011
comment
Все помощники, ориентированные на MVC 3 и выше, должны возвращать IHtmlString. - именно то, что мне нужно было знать! - person John Reilly; 11.01.2013