Испускание незакодированных строк в режиме Razor

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

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

@{
 var html = "<a href='#'>Click me</a>"
 // I want to emit the previous string as pure HTML code...
}

Ответ 2

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

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

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

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

@{
  var html = new HtmlString("<a href='#'>Click me</a>")
}

Ответ 3

Новый HtmlString определенно является ответом.

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

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

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

или

@"<p>something</p>".AsHtml()

Ответ 4

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

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

@(new HtmlString(View.Foo))

// became
@RawView.Foo

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

@RawView["Foo"]

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

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

Ответ 5

Я использую 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>