ASP.NET MVC Razor render sin codificación

Respuestas:

374

Desde ASP.NET MVC 3, puede usar:

@Html.Raw(myString)
Lucas
fuente
8
Esto no es del todo correcto. Sí, puede insertar una cadena sin formato, pero si tiene "'<>etc...estos se escaparán. La forma correcta es usar MvcHtmlString que permitirá caracteres "ilegales". Por ejemplo, si está codificando datos Json ... sin codificar un modelo completo
Daniel B. Chapman
44
Daniel, Html.Raw () "devuelve un marcado que no está codificado en HTML".
Lucas
1
Html.Raw () codifica las citas ..."myAttr='hello';myInt=10"
Serge
44
NO codifica comillas. Además de la documentación obvia que lo indica como el día ( "Este método envuelve el marcado HTML usando la clase IHtmlString, que representa HTML no codificado " ). También probé esto y las citas no están codificadas.
James Wilkins, el
58
@(new HtmlString(myString))
Matthew Vines
fuente
31

Además del enfoque @ Html.Raw (string) ya mencionado, si genera un MvcHtmlString no se codificará. Esto puede ser útil al agregar sus propias extensiones a HtmlHelper, o al devolver un valor de su modelo de vista que sabe que puede contener html.

Por ejemplo, si su modelo de vista era:

public class SampleViewModel
{
  public string SampleString { get; set; }
  public MvcHtmlString SampleHtmlString { get; set; }
}

Para Core 1.0+ (y MVC 5+) use HtmlString

public class SampleViewModel
{
  public string SampleString { get; set; }
  public HtmlString SampleHtmlString { get; set; }
}

luego

<!-- this will be encoded -->
<div>@Model.SampleString</div>
<!-- this will not be encoded -->
<div>@Html.Raw(Model.SampleString)</div>
<!-- this will not be encoded either -->
<div>@Model.SampleHtmlString</div>
Jonathan Moffatt
fuente
10

Úselo @Html.Raw()con precaución ya que puede causar más problemas con la codificación y la seguridad. Entiendo el caso de uso ya que tuve que hacerlo yo mismo, pero con cuidado ... Solo evite dejar pasar todo el texto. Por ejemplo, solo preserva / convierte secuencias de caracteres específicas y siempre codifica el resto:

@Html.Raw(Html.Encode(myString).Replace("\n", "<br/>"))

Entonces tiene la tranquilidad de que no ha creado un agujero de seguridad potencial y que los caracteres especiales / extranjeros se muestran correctamente en todos los navegadores.

Tony Wall
fuente
+1 ¡Exactamente lo que necesitaba! La cadena aún necesita ser codificada, pero los retornos de línea deben ser html. ¡Gracias!
Peter
@Html.Raw(Html.Encode(myString).Replace(Html.Encode("\n"), "<br/>"))para ASP.NET Core
kenjiuno
5

En el caso de ActionLink, generalmente usa HttpUtility.Encode en el texto del enlace. En ese caso, puede usarlo HttpUtility.HtmlDecode(myString) , funcionó para mí cuando use HtmlActionLink para decodificar la cadena que quería pasar. p.ej:

  @Html.ActionLink(HttpUtility.HtmlDecode("myString","ActionName",..)

gutsy_guy
fuente
1

También puedes usar el método WriteLiteral

Hamid Shahid
fuente
1

HTML RAW:

@Html.Raw(yourString)
Farbod
fuente