Что такое MvcHtmlString и когда мне его использовать?

Документация для MvcHtmlString не очень поучительно

Представляет строку в кодировке HTML, которую не следует кодировать снова.

Мне не ясно, каковы именно последствия этого. Кажется, что некоторые вспомогательные методы HTML возвращают MvcHtmlString, но несколько примеров, которые я видел в Интернете о пользовательских помощниках, просто возвращают обычную строку.

Вопросы:

Что такое MvcHtmlString?

Когда я должен выбрать MvcHtmlString над string и наоборот? Зачем?

4 ответа

Решение

ASP.NET 4 вводит новый синтаксис слепка кода <%: %>, По существу, <%: foo %> переводит на <%= HttpUtility.HtmlEncode(foo) %>, Команда пытается заставить разработчиков использовать <%: %> вместо <%= %> везде, где это возможно, чтобы предотвратить XSS.

Однако это создает проблему, заключающуюся в том, что если слепок кода уже кодирует свой результат, <%: %> синтаксис перекодирует его. Это решается введением интерфейса IHtmlString (нового в.NET 4). Если foo() в <%: foo() %> возвращает IHtmlString, <%: %> синтаксис не перекодирует его.

Помощники MVC 2 возвращают MvcHtmlString, который в ASP.NET 4 реализует интерфейс IHtmlString. Поэтому, когда разработчики используют <%: Html.*() %> в ASP.NET 4 результат не будет закодирован дважды.

Редактировать:

Непосредственным преимуществом этого нового синтаксиса является то, что ваши взгляды немного чище. Например, вы можете написать <%: ViewData["anything"] %> вместо <%= Html.Encode(ViewData["anything"]) %>,

Это поздний ответ, но если кто-то читает этот вопрос, использует бритву, то вы должны помнить, что бритва все кодирует по умолчанию, но с помощью MvcHtmlString в ваших HTML помощниках вы можете сказать бритве, что ей не нужно кодировать ее.

Если вы хотите, чтобы бритва не кодировала строку, используйте

@Html.Raw("<span>hi</span>")

Декомпиляция Raw() показывает, что он переносит строку в HtmlString

public IHtmlString Raw(string value) {
    return new HtmlString(value); 
}

" HtmlString существует только в ASP.NET 4.

MvcHtmlString была оболочкой совместимости, добавленной в MVC 2 для поддержки.NET 3.5 и.NET 4. Теперь, когда MVC 3 является только.NET 4, это довольно тривиальный подкласс HtmlString, предположительно для MVC 2->3 для совместимости с исходным кодом. " источник

Хорошее практическое использование этого, если вы хотите сделать свой собственный HtmlHelper расширения. Например, я ненавижу пытаться вспомнить <link> синтаксис тега, поэтому я создал свой собственный метод расширения, чтобы сделать <link> тег:

<Extension()> _
Public Function CssBlock(ByVal html As HtmlHelper, ByVal src As String, ByVal Optional ByVal htmlAttributes As Object = Nothing) As MvcHtmlString
    Dim tag = New TagBuilder("link")
    tag.MergeAttribute("type", "text/css")
    tag.MergeAttribute("rel", "stylesheet")
    tag.MergeAttribute("href", src)
    tag.MergeAttributes(New RouteValueDictionary(htmlAttributes))
    Dim result = tag.ToString(TagRenderMode.Normal)
    Return MvcHtmlString.Create(result)
End Function

Я мог бы вернуться String из этого метода, но если бы у меня было следующее сломалось бы:

<%: Html.CssBlock(Url.Content("~/sytles/mysite.css")) %>

С MvcHtmlString, используя либо <%: ... %> или же <%= ... %> оба будут работать правильно.

Вы бы использовали MvcHtmlString если вы хотите передать необработанный HTML во вспомогательный метод MVC и не хотите, чтобы вспомогательный метод кодировал HTML.

Другие вопросы по тегам