216 votes

Ce qui est un MvcHtmlString et lorsque je devrais l’utilise ?

La documentation pour l' MvcHtmlString n'est pas très éclairante:

Représente une codé en HTML chaîne qui ne doit pas être codé à nouveau.

Il n'est pas clair pour moi qu'est-ce exactement les implications de tout ceci. Il semble que certains helper HTML méthodes retournent un MvcHtmlString, mais plusieurs exemples, que j'ai vu en ligne de l'aide personnalisée juste retour régulier de la chaîne.

Questions:

Qu'est ce qu'un MvcHtmlString?

Quand dois-je choisir MvcHtmlString sur string , et vice-versa? Pourquoi?

244voto

Levi Points 22222

ASP.NET 4 introduit un nouveau code de pépite de la syntaxe <%: %>. Essentiellement, <%: foo %> se traduit par <%= HttpUtility.HtmlEncode(foo) %>. L'équipe est d'essayer d'obtenir les développeurs, <%: %> au lieu de <%= %> dans la mesure du possible pour éviter les attaques de type XSS.

Toutefois, cela pose le problème que si un code de pépite déjà encode son résultat, l' <%: %> de la syntaxe du ré-encoder . Ce problème est résolu par l'introduction de la IHtmlString interface (nouvelle dans .NET 4). Si les foo() en <%: foo() %> renvoie un IHtmlString, l' <%: %> de la syntaxe ne sera pas ré-encoder.

MVC 2 aides-retour MvcHtmlString, qui, sur ASP.NET 4 implémente l'interface IHtmlString. Par conséquent, lorsque les développeurs à utiliser des <%: Html.*() %> dans ASP.NET 4, le résultat ne sera pas codées double.

Edit:

Un avantage immédiat de cette nouvelle syntaxe est votre point de vue un peu plus propre. Par exemple, vous pouvez écrire <%: ViewData["anything"] %> au lieu de <%= Html.Encode(ViewData["anything"]) %>.

85voto

Torbjörn Nomell Points 1365

C'est une réponse tardive mais si quelqu'un lisant cette question est à l'aide d'un rasoir, ce que vous devez retenir, c'est que le rasoir encode tout par défaut, mais en utilisant MvcHtmlString dans votre code html helpers, vous pouvez dire de rasoir qu'il n'a pas besoin de coder.

Si vous voulez rasoir pour ne pas coder une chaîne de caractères utilisez

@Html.Raw("<span>hi</span>")

La décompilation Raw(), nous montre que c'est l'habillage de la chaîne dans un HtmlString

public IHtmlString Raw(string value) {
    return new HtmlString(value); 
}

"HtmlString n'existe que dans ASP.NET 4.

MvcHtmlString était une compatibilité cale ajouté MVC 2 à soutenir à la fois .NET 3.5 et .NET 4. Maintenant que MVC 3 est .NET 4 seulement, c'est un assez trivial sous-classe de HtmlString sans doute pour MVC 2->3 pour la compatibilité de la source." source

11voto

mattmc3 Points 6768

Une belle utilisation pratique de ce est si vous voulez faire votre propre HtmlHelper extensions. Par exemple, j'ai hate d'essayer de se souvenir de l' <link> balise de syntaxe, j'ai donc créé ma propre méthode d'extension pour faire une <link> balise:

<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

Je pourrais avoir retourné String à partir de cette méthode, mais si j'avais les suivantes:pause

<%: Html.CssBlock(Url.Content("~/sytles/mysite.css")) %>

Avec MvcHtmlString, en utilisant soit <%: ... %> ou <%= ... %> à la fois travailler correctement.

7voto

SLaks Points 391154

Vous utiliseriez un MvcHtmlString si vous voulez passer du HTML brut à une méthode d'assistance MVC et que vous ne voulez pas que la méthode d'assistance code le code HTML.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X