2012-04-26 2 views
21

Sto creando un progetto MVC. Utilizzo di MVC 4 e Razor. Dopo aver costruito alcune pagine mi chiedevo: che cosa è la differenza traDifferenza tra MvcHtmlString.Create() e Html.Raw()

MvcHtmlString.Create() 

e

Html.Raw() 

Sarebbe bello se potesse aiutare a comprendere che qui.

Grazie in anticipo!

risposta

21

Questa è un'eccellente opportunità per consultare il codice sorgente disponibile per ASP.NET (http://aspnetwebstack.codeplex.com).

Guardando HtmlHelper.cs, questo è il codice per Html.Raw():

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

public IHtmlString Raw(object value) 
{ 
    return new HtmlString(value == null ? null : value.ToString()); 
} 

e questo è il codice per la classe MvcHtmlString:

namespace System.Web.Mvc 
{ 
    public sealed class MvcHtmlString : HtmlString 
    { 
     [SuppressMessage("Microsoft.Security", "CA2104:DoNotDeclareReadOnlyMutableReferenceTypes", Justification = "MvcHtmlString is immutable")] 
     public static readonly MvcHtmlString Empty = Create(String.Empty); 

     private readonly string _value; 

     public MvcHtmlString(string value) 
      : base(value ?? String.Empty) 
     { 
      _value = value ?? String.Empty; 
     } 

     public static MvcHtmlString Create(string value) 
     { 
      return new MvcHtmlString(value); 
     } 

     public static bool IsNullOrEmpty(MvcHtmlString value) 
     { 
      return (value == null || value._value.Length == 0); 
     } 
    } 
} 

La differenza più significativa è che accetta qualsiasi Html.Raw() oggetto, mentre MvcHtmlString.Create() accetta solo stringhe. Inoltre, Html.Raw() restituisce un'interfaccia, mentre il metodo Create restituisce un oggetto MvcHtmlString. Infine, la creazione di offerte con null in modo diverso.

+0

Grazie per la risposta! Ma quale di questi dovrebbe essere preferito? – Julian

+2

@ Julian: Dipende da dove si trova il codice e da cosa è facilmente accessibile. Io di solito non uso nessuno dei due, uso solo 'new HtmlString()'. – Guffa

+1

@ Julian Come Guffa ha detto: Dipende da dove si trova il tuo codice. In una vista preferisco Html.Raw, ma principalmente perché è esteticamente gradevole quando leggo il codice (non è un argomento molto valido, lo so). –

5

Non c'è alcuna differenza pratica.

Il MvcHtmlString.Create crea un'istanza di MvcHtmlString, mentre il metodo Html.Raw crea un'istanza di HtmlString, ma MvcHtmlString solo eredita da HtmlString, quindi funzionano allo stesso.

+0

Solo una domanda: Msdn dice per Html.Raw(): restituisce markup che non è codificato in HTML./per MvcHtmlString.Create: crea una stringa con codifica HTML utilizzando il valore di testo specificato. Quindi: Html codificato/non codificato non fa "differenza pratica", o mi sono perso qualcosa? –

+1

@ RaphaëlAlthaus: il risultato è esattamente lo stesso, è spiegato solo in modo diverso. Il wrapping di una stringa in una classe che implementa 'IHtmlString' protegge la stringa dall'essere codificata in HTML quando la si stampa utilizzando il tag del server' <%: %> '. – Guffa

+0

Ho perso l'ultimo punto;) Thx! –