Che cos’è un MvcHtmlString e quando dovrei usarlo?

La documentazione per MvcHtmlString non è terribilmente illuminante:

Rappresenta una stringa con codifica HTML che non dovrebbe essere nuovamente codificata.

Non mi è chiaro quali siano esattamente le implicazioni di ciò. Sembra che alcuni metodi helper HTML restituiscano un MvcHtmlString , ma diversi esempi che ho visto online di helper personalizzati restituiscono semplicemente una stringa regolare.

Domande:

Che cos’è un MvcHtmlString ?

Quando dovrei scegliere MvcHtmlString over string e viceversa? Perché?

ASP.NET 4 introduce una nuova syntax del nugget del codice <%: %> . In sostanza, <%: foo %> traduce in <%= HttpUtility.HtmlEncode(foo) %> . Il team sta cercando di convincere gli sviluppatori a utilizzare <%: %> invece di <%= %> laddove ansible per evitare XSS.

Tuttavia, questo introduce il problema che se un nugget di codice codifica già il suo risultato, la syntax <%: %> la ricodificherà . Ciò è risolto dall’introduzione dell’interfaccia IHtmlString (nuova in .NET 4). Se foo () in <%: foo() %> restituisce un IHtmlString, la syntax <%: %> non la codificherà nuovamente.

Gli helper di MVC 2 restituiscono MvcHtmlString, che su ASP.NET 4 implementa l’interfaccia IHtmlString. Pertanto, quando gli sviluppatori usano <%: Html.*() %> In ASP.NET 4, il risultato non sarà codificato in doppia.

Modificare:

Un vantaggio immediato di questa nuova syntax è che i tuoi punti di vista sono un po ‘più puliti. Ad esempio, puoi scrivere <%: ViewData["anything"] %> invece di <%= Html.Encode(ViewData["anything"]) %> .

Questa è una risposta tardiva, ma se qualcuno che legge questa domanda usa il razor, ciò che dovresti ricordare è che il razor codifica tutto per impostazione predefinita, ma usando MvcHtmlString nei tuoi helper html puoi dire al razor che non ha bisogno di codificarlo .

Se vuoi che il razor non codifichi una stringa usa

 @Html.Raw("hi") 

Decompiling Raw (), ci mostra che sta avvolgendo la stringa in un HtmlString

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

HtmlString esiste solo in ASP.NET 4.

MvcHtmlString era uno shim di compatibilità aggiunto a MVC 2 per supportare sia .NET 3.5 che .NET 4. Ora che MVC 3 è solo .NET 4, è una sottoclass abbastanza semplice di HtmlString presumibilmente per MVC 2-> 3 per la compatibilità di origine. ” fonte

Un buon uso pratico di questo è se vuoi creare le tue estensioni HtmlHelper . Ad esempio, odio cercare di ricordare la syntax del tag , quindi ho creato il mio metodo di estensione per creare un tag :

  _ 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 

Potrei avere restituito String da questo metodo, ma se avessi il seguente si romperebbe:

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

Con MvcHtmlString , l’utilizzo di <%: ... %> o <%= ... %> funzionerà entrambi correttamente.

Si utilizzerà MvcHtmlString se si desidera passare HTML non MvcHtmlString a un metodo helper MVC e non si desidera che il metodo helper codifichi l’HTML.