2010-02-19 29 views
205

Il documentation per MvcHtmlString non è molto illuminante:Che cos'è un MvcHtmlString e quando dovrei usarlo?

Rappresenta una stringa HTML con codifica che non dovrebbe essere codificato di nuovo.

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

Domande:

Cos'è un MvcHtmlString?

Quando è necessario scegliere MvcHtmlString su string e viceversa? Perché?

risposta

240

ASP.NET 4 introduce una nuova sintassi del nugget del codice <%: %>. In sostanza, <%: foo %> viene convertito in <%= HttpUtility.HtmlEncode(foo) %>. Il team sta cercando di indurre gli sviluppatori a utilizzare <%: %> anziché <%= %> laddove possibile per impedire XSS.

Tuttavia, questo introduce il problema che se un codice pepita di codifica già il suo risultato, la sintassi <%: %> sarà ri-codificare esso. Ciò è risolto dall'introduzione dell'interfaccia IHtmlString (nuova in .NET 4). Se foo() in <%: foo() %> restituisce IHtmlString, la sintassi <%: %> non la codificherà nuovamente.

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

Edit:

Un beneficio immediato di questa nuova sintassi è che le vostre opinioni sono un po 'più pulito. Ad esempio, è possibile scrivere <%: ViewData["anything"] %> anziché <%= Html.Encode(ViewData["anything"]) %>.

+0

Aggiungo che MVC 2 è compilato su .Net 3.5, non su 4. Ciò significa che 'MvcHtmlString' non implementa' IHtmlString' perché esiste solo in 4. La sintassi '<%:' deve _duck-type_ - chiamerà sempre '.ToHtmlString()' prima di '.ToString()' indipendentemente dall'interfaccia. – Keith

+1

Sono corretto - in realtà il metodo 'MvcHtmlString.Create' rileva se' IHtmlString' è disponibile e crea dinamicamente la classe restituita per supportarlo se lo è: http://www.windowsitpro.com/article/net-framework/Encoding -and-Strings/3.aspx – Keith

+0

ancora un'ottima risposta alla seconda lettura :) – melaos

6

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

+0

Hmm ... ho pensato che il punto centrale di un metodo di supporto HTML è stato per codificare HTML. Cosa farei altrimenti con un metodo di supporto HTML? – devuxer

+0

E, oltre a questo, quando dovrei * ritorno * un 'MvcHtmlString' da un metodo helper HTML? – devuxer

+0

Passa o ritorna da. Vorresti restituirne uno se il tuo helper HTML genera codice HTML precampato e non vuoi che qualcun altro riesca a evaderlo. – SLaks

11

Un buon uso pratico di questo è se si desidera creare le proprie estensioni HtmlHelper. Ad esempio, io odio cercando di ricordare la sintassi <link> tag, così ho creato il mio metodo di estensione per fare un tag <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 

avrei potuto tornato String da questo metodo, ma se ho avuto il seguente si rompono:

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

Con MvcHtmlString, utilizzando <%: ... %> o <%= ... %> saranno entrambi funzionano correttamente.

70

Questa è una risposta in ritardo, ma se qualcuno leggendo questa domanda sta usando il rasoio, ciò che si dovrebbe ricordare è che rasoio codifica tutto per impostazione predefinita, ma utilizzando MvcHtmlString nei vostri aiutanti html si può dire rasoio che non ha bisogno di per codificarlo.

Se si desidera rasoio per non codificare utilizzare una stringa

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

decompilazione Raw(), ci mostra che è 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 entrambi .NET 3.5 e .NET 4. Ora che MVC 3 è solo .NET 4, è una sottoclasse abbastanza semplice di HtmlString presumibilmente per MVC 2-> 3 per la compatibilità di origine. " source

Problemi correlati