Razor codifica la cadena por defecto. ¿Hay alguna sintaxis especial para renderizar sin codificar?
Razor codifica la cadena por defecto. ¿Hay alguna sintaxis especial para renderizar sin codificar?
Respuestas:
Desde ASP.NET MVC 3, puede usar:
@Html.Raw(myString)
"myAttr='hello';myInt=10"
@(new HtmlString(myString))
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>
Ú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.
@Html.Raw(Html.Encode(myString).Replace(Html.Encode("\n"), "<br/>"))
para ASP.NET Core
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",..)
También puedes usar el método WriteLiteral
"'<>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