Что такое 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.