Что такое MvcHtmlString и когда мне его использовать? - PullRequest
213 голосов
/ 19 февраля 2010

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

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

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

Вопросы:

Что такое MvcHtmlString?

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

Ответы [ 4 ]

244 голосов
/ 19 февраля 2010

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

Edit:

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

82 голосов
/ 26 января 2012

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

11 голосов
/ 14 декабря 2010

Хорошее практическое использование это, если вы хотите сделать свои собственные 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 использование <%: ... %> или <%= ... %> будет работать правильно.

7 голосов
/ 19 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...