ASP.NET MVC Razor визуализировать без кодирования

250

Razor кодирует строку по умолчанию. Есть ли специальный синтаксис для рендеринга без кодирования?

SiberianGuy
источник

Ответы:

374

Начиная с ASP.NET MVC 3, вы можете использовать:

@Html.Raw(myString)
Лукас
источник
8
Это не совсем правильно. Да, вы можете вставить необработанную строку, но если она у вас есть, "'<>etc...она будет экранирована. Правильный способ - использовать MvcHtmlString, который разрешит «недопустимые» символы. Например, если вы кодируете данные Json ... без кодирования всей модели
Дэниел Б. Чепмен,
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
кендзиуно
5

В случае ActionLink он обычно использует HttpUtility.Encode в тексте ссылки. В этом случае вы можете использовать HttpUtility.HtmlDecode(myString) его для меня, когда используете HtmlActionLink для декодирования строки, которую я хотел передать. например:

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

gutsy_guy
источник
1

Вы также можете использовать метод WriteLiteral

Хамид Шахид
источник