Выдача некодированных строк в представлении Razor

81

Как говорит ScottGu в своем блоге пост «по содержанию по умолчанию , излучаемого с помощью @ блок автоматически HTML закодированный , чтобы лучше защитить от сценариев атак XSS». У меня вопрос: как вывести строку, не закодированную в HTML?

Для простоты, пожалуйста, придерживайтесь этого простого случая:

@{
 var html = "<a href='#'>Click me</a>"
 // I want to emit the previous string as pure HTML code...
}
Hemme
источник

Ответы:

17

Вы можете создать новый экземпляр MvcHtmlString, который не будет закодирован в HTML.

@{
  var html = MvcHtmlString.Create("<a href='#'>Click me</a>")
}

Надеюсь, в будущем Razor будет более простой способ.

Если вы не используете MVC, вы можете попробовать следующее:

@{
  var html = new HtmlString("<a href='#'>Click me</a>")
}
Aolde
источник
2
На самом деле вы также можете использовать new HtmlString()в MVC 3, поскольку этот тип - .NET 4.
Марсинд
Конечно! Однако когда я набираю все это в одном выражении, мне больше нравится MVC. Например, @ MvcHtmlString.Create (myString). Личное предпочтение!
aolde
6

new HtmlString - определенно ответ.

Мы рассмотрели некоторые другие изменения синтаксиса бритвы, но в конечном итоге ни одно из них не оказалось короче нового HtmlString.

Однако мы можем превратить это в помощника. Возможно ...

@Html.Literal("<p>something</p>")

или же

@"<p>something</p>".AsHtml()
Эрик Портер
источник
1
Можно ли добавить @ = myString как способ вывода HTML? Может быть, слишком много воспоминаний о WebForms ...
aolde
2
Мы хотим избежать добавления синтаксических конструкций там, где они не охватывают основной пользовательский случай. В большинстве случаев вы будете использовать вспомогательные методы для построения строк, и IHtmlString отлично там работает. Для нечетных случаев, когда вам нужно вывести буквальную строку без помощника, мы можем предоставить вам метод: @Literal (foo) или аналогичный.
Эндрю Стэнтон-Медсестра,
0

Я столкнулся с этой проблемой также при переходе нашего проекта на новый механизм просмотра Razor. Подход, который я использовал, немного отличался, потому что мы должны были генерировать данные JSON из C # и хотели выводить их при загрузке страницы.

В конечном итоге я реализовал RawView, который был параллелью View внутри файлов cshtml. По сути, чтобы получить необработанную строку,

@(new HtmlString(View.Foo))

// became
@RawView.Foo

Это требует нескольких изменений в макете проекта, поэтому я просто написал об этом в блоге здесь . Короче говоря, для этого требовалась дублированная реализация MVC DynamicViewDataDictionary и новый WebViewPage, содержащий RawView. Я также пошел дальше и реализовал оператор индекса в RawView, чтобы разрешить

@RawView["Foo"]

На случай, если кому-то понадобится перебрать данные со списком ключей.

Читая комментарий анурса, наверное, было бы лучше, если бы я назвал это как Literal вместо RawView.

Ань-Кьет Нго
источник
0

Я использую ASP.NET MVC и Razor под Mono.

По некоторым причинам мне не удалось получить HtmlHelper из System.Web.WebPages из System.Web.Mvc.

Но мне удалось вывести незакодированную строку после объявления свойства модели как RazorEngine.Text.RawString. Теперь он выводит, как ожидалось.

пример

@{
    var txt = new RawString("some text with \"quotes\"");
    var txt2 = "some text with \"quotes\"";
}
<div>Here is unencoded text: @txt</div>
<div>Here is encoded text: @txt2</div>

Вывод:

<div>Here is unencoded text: some text with "quotes"</div>
<div>Here is encoded text: some text with &quot;quotes&quot;</div>
порфирий
источник