Что такое MvcHtmlString и когда я должен его использовать?
The документация на MvcHtmlString не очень поучительно:
представляет HTML-кодированную строку, которая не должна быть закодирована снова.
мне не ясно, какие именно последствия это имеет. Кажется, что некоторые вспомогательные методы HTML возвращают MvcHtmlString, но несколько примеров, которые я видел в интернете пользовательских помощников, просто возвращают обычную строку.
вопросы:
Что такое MvcHtmlString?
когда я должен выбрать MvcHtmlString over string и наоборот? Зачем?
4 ответов:
ASP.NET 4 вводится новый синтаксис самородка кода
<%: %>. По сути,<%: foo %>переводится как<%= HttpUtility.HtmlEncode(foo) %>. Команда пытается заставить разработчиков использовать<%: %>вместо<%= %>везде, где это возможно, чтобы предотвратить XSS.однако, это вводит проблему, что если самородок кода уже кодирует свой результат, то
<%: %>синтаксис перекодировать его. Это решается путем введения интерфейса IHtmlString (новый в .NET 4). Если foo () в<%: foo() %>возвращает IHtmlString, the<%: %>синтаксис не будет перекодировать его.помощники MVC 2 возвращают MvcHtmlString, который включен ASP.NET 4 реализует интерфейс IHtmlString. Поэтому, когда разработчики используют
<%: Html.*() %>in ASP.NET 4, результат не будет дважды закодирован.Edit:
непосредственным преимуществом этого нового синтаксиса является то, что ваши представления немного чище. Например, вы можете написать
<%: ViewData["anything"] %>вместо<%= Html.Encode(ViewData["anything"]) %>.
это поздний ответ, но если кто-то из читающих этот вопрос с помощью бритвы, что вы должны помнить, что бритва кодирует все по умолчанию но с помощью
MvcHtmlStringв ваших HTML-помощниках вы можете сказать razor, что ему не нужно кодировать его.Если вы хотите, чтобы razor не кодировал строку, используйте
@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.
Comments