2012-04-26 17 views
21

Estoy creando un MVC-Project. Usando MVC 4 y Razor. Después de la construcción de algunas páginas me preguntaba: ¿cuál es la diferencia entreDiferencia entre MvcHtmlString.Create() y Html.Raw()

MvcHtmlString.Create() 

y

Html.Raw() 

Sería bueno si pudiera ayudar aquí a entender eso.

¡Gracias de antemano!

Respuesta

21

Esta es una excelente oportunidad para ver el código fuente que está disponible para ASP.NET (http://aspnetwebstack.codeplex.com).

En cuanto a HtmlHelper.cs, este es el código de Html.Raw():

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

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

Y este es el código de la clase 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 diferencia más significativa es que acepta cualquier Html.Raw() objeto, mientras que MvcHtmlString.Create() solo acepta cadenas. Además, Html.Raw() devuelve una interfaz, mientras que el método Create devuelve un objeto MvcHtmlString. Por último, Create genera null de manera diferente.

+0

¡Gracias por esa respuesta! Pero, ¿cuál de estos debería ser preferido? – Julian

+2

@Julian: Eso depende de dónde está el código y a qué tiene acceso fácilmente. Ususally no uso ninguno, solo uso 'new HtmlString()'. – Guffa

+1

@Julian Like Guffa dijo: Depende de dónde está tu código. En una vista, prefiero Html.Raw, pero principalmente porque es estéticamente agradable cuando leo el código (no es un argumento realmente bueno, lo sé). –

5

No hay diferencia práctica.

El MvcHtmlString.Create crea una instancia de MvcHtmlString, mientras que el método Html.Raw crea una instancia de HtmlString, pero MvcHtmlString simplemente hereda de HtmlString, por lo que funcionan de la misma.

+0

Solo una pregunta: Msdn dice que para Html.Raw(): Devuelve un marcado que no está codificado en HTML./for MvcHtmlString.Create: crea una cadena codificada en HTML utilizando el valor de texto especificado. Así que: Html codificado/no codificado no hace "diferencia práctica", ¿o extrañé algo? –

+1

@ RaphaëlAlthaus: El resultado es exactamente el mismo, solo se explica de manera diferente. Envolver una cadena en una clase que implemente 'IHtmlString' protege la cadena de ser codificada en HTML cuando la genere usando la etiqueta de servidor' <%: %> '. – Guffa

+0

Me perdí el último punto;) ¡Thx! –