Відображення ASP.NET MVC Razor без кодування


Відповіді:


374

Оскільки ASP.NET MVC 3, ви можете використовувати:

@Html.Raw(myString)

8
Це не зовсім правильно. Так, ви можете вставити необроблений рядок, але якщо у вас є, "'<>etc...це буде уникнути. Правильний спосіб - використовувати MvcHtmlString, який дозволить "незаконних" символів. Наприклад, якщо ви кодуєте дані Json ... без кодування цілої моделі
Daniel B. Chapman

4
Daniel, Html.Raw () "повертає розмітку, кодовану не HTML."
Лукас

1
Html.Raw () кодує цитати ..."myAttr='hello';myInt=10"
Серж

4
Він НЕ кодує лапки. Окрім очевидної документації, що визначає його як день ( "Цей метод завершує розмітку HTML за допомогою класу IHtmlString, який надає незашифрований HTML." ) Я також перевірив це, і лапки не кодуються.
Джеймс Вілкінс


31

Як і вже згаданий підхід @ 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>

10

Використовуйте @Html.Raw()обережно, оскільки ви можете створити більше проблем з кодуванням та безпекою. Я розумію випадок використання, оскільки мені довелося це робити самому, але обережно ... Просто уникайте пропускання всього тексту. Наприклад, зберігати / конвертувати конкретні послідовності символів і завжди кодувати решту:

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

Тоді ви відчуваєте спокій, що не створили потенційну дірку безпеки та будь-які спеціальні / іноземні символи відображаються правильно у всіх браузерах.


+1 Саме те, що мені було потрібно! Рядок все ще потрібно закодувати, але рядкові повернення повинні бути html. Дякую!
Пітер

@Html.Raw(Html.Encode(myString).Replace(Html.Encode("\n"), "<br/>"))для ASP.NET Core
kenjiuno

5

У випадку ActionLink він зазвичай використовує HttpUtility.Encode у тексті посилання. У такому випадку ви можете використовувати HttpUtility.HtmlDecode(myString) це, що працювало на мене під час використання HtmlActionLink для декодування рядка, який я хотів передати. наприклад:

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



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.