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



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




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




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



вопросы:



Что такое MvcHtmlString?



когда я должен выбрать MvcHtmlString over string и наоборот? Зачем?

467   4  

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

    Ничего не найдено.