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