Razor кодує рядок за замовчуванням. Чи є якийсь спеціальний синтаксис для візуалізації без кодування?
Razor кодує рядок за замовчуванням. Чи є якийсь спеціальний синтаксис для візуалізації без кодування?
Відповіді:
Оскільки ASP.NET MVC 3, ви можете використовувати:
@Html.Raw(myString)
"myAttr='hello';myInt=10"
@(new HtmlString(myString))
Як і вже згаданий підхід @ Html.Raw (string), якщо ви виведете MvcHtmlString, він не буде закодований. Це може бути корисно при додаванні власних розширень до HtmlHelper або при поверненні значення з вашої моделі перегляду, яка, на вашу думку, може містити HTML.
Наприклад, якщо модель перегляду була такою:
public class SampleViewModel
{
public string SampleString { get; set; }
public MvcHtmlString SampleHtmlString { get; set; }
}
Для Core 1.0+ (та MVC 5+) використовуйте HtmlString
public class SampleViewModel
{
public string SampleString { get; set; }
public HtmlString SampleHtmlString { get; set; }
}
тоді
<!-- 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>
Використовуйте @Html.Raw()
обережно, оскільки ви можете створити більше проблем з кодуванням та безпекою. Я розумію випадок використання, оскільки мені довелося це робити самому, але обережно ... Просто уникайте пропускання всього тексту. Наприклад, зберігати / конвертувати конкретні послідовності символів і завжди кодувати решту:
@Html.Raw(Html.Encode(myString).Replace("\n", "<br/>"))
Тоді ви відчуваєте спокій, що не створили потенційну дірку безпеки та будь-які спеціальні / іноземні символи відображаються правильно у всіх браузерах.
@Html.Raw(Html.Encode(myString).Replace(Html.Encode("\n"), "<br/>"))
для ASP.NET Core
У випадку ActionLink він зазвичай використовує HttpUtility.Encode у тексті посилання. У такому випадку ви можете використовувати
HttpUtility.HtmlDecode(myString)
це, що працювало на мене під час використання HtmlActionLink для декодування рядка, який я хотів передати. наприклад:
@Html.ActionLink(HttpUtility.HtmlDecode("myString","ActionName",..)
Ви також можете використовувати метод WriteLiteral
"'<>etc...
це буде уникнути. Правильний спосіб - використовувати MvcHtmlString, який дозволить "незаконних" символів. Наприклад, якщо ви кодуєте дані Json ... без кодування цілої моделі