Как ScottGu заявляет в его сообщении в блоге «содержанием по умолчанию, испускаемым с помощью, блоком является автоматически HTML, закодированный для лучше защиты от сценариев нападения XSS». Мой вопрос: как можно произвести строку non-HTML-encoded?
Ради простоты придерживайтесь этого простого случая:
@{
var html = "Click me"
// I want to emit the previous string as pure HTML code...
}
Вы можете создать новый экземпляр MvcHtmlString, который не будет кодировать HTML.
@{
var html = MvcHtmlString.Create("<a href='#'>Click me</a>")
}
Надеюсь, в будущем Razor будет более простой путь.
Если вы не используете MVC, вы можете попробовать следующее:
@{
var html = new HtmlString("<a href='#'>Click me</a>")
}
new HtmlString определенно ответ.
Мы рассмотрели некоторые другие изменения синтаксиса бритвы, но в конечном итоге ни одно из них не оказалось короче нового HtmlString.
Однако мы можем превратить это в помощника. Возможно ...
@Html.Literal("<p>something</p>")
или
@"<p>something</p>".AsHtml()
Я также столкнулся с этой проблемой при переходе нашего проекта на новый механизм просмотра Razor. Подход, который я использовал, немного отличался, потому что мы должны были генерировать данные JSON из C # и хотели выводить их при загрузке страницы.
В конечном итоге я реализовал RawView, который был параллелью View внутри файлов cshtml. По сути, чтобы получить необработанную строку
@(new HtmlString(View.Foo))
// became
@RawView.Foo
, необходимо внести несколько изменений в макет проекта, поэтому я просто написал об этом сообщение в блоге здесь . Короче говоря, для этого потребовалась дублированная реализация DynamicViewDataDictionary MVC и новый WebViewPage, содержащий RawView. Я также пошел дальше и реализовал оператор индекса в RawView, чтобы учесть
@RawView["Foo"]
На случай, если кому-то понадобится перебрать данные со списком ключей.
Читая комментарий анурса, наверное, было бы лучше, если бы я назвал это как Literal вместо RawView.