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

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

Представляет строку в кодировке HTML, которая не должна быть закодирована снова.

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

Вопросы:

Что такое MvcHtmlString?

Когда мне следует выбрать MvcHtmlString над string и наоборот? Почему?

Ответ 1

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

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

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

Edit:

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

Ответ 2

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

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

@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 для совместимости с исходным кодом ". источник

Ответ 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, используя либо <%: ... %>, либо <%= ... %>, оба будут работать правильно.

Ответ 4

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