Испускание некодированных строк в виде бритвы
Как ScottGu пишет в своем блоге post "по умолчанию контент, создаваемый с помощью @ block, автоматически кодируется HTML для лучшей защиты от сценариев атаки XSS". Мой вопрос: как вы можете вывести строку, не закодированную в HTML?
для простоты, пожалуйста, придерживайтесь этого простого случая:
@{
var html = "<a href='#'>Click me</a>"
// I want to emit the previous string as pure HTML code...
}
4 ответа:
Это мой любимый подход:
@Html.Raw("<p>my paragraph text</p>")
источником была ссылка на синтаксис бритвы Фила Хаака:http://haacked.com/archive/2011/01/06/razor-syntax-quick-reference.aspx
вы можете создать новый экземпляр MvcHtmlString, который не будет кодироваться HTML.
@{ var html = MvcHtmlString.Create("<a href='#'>Click me</a>") }
надеюсь, что будет более простой способ в будущем бритвы.
Если вы не используете MVC, вы можете попробовать это:
@{ var html = new HtmlString("<a href='#'>Click me</a>") }
новый HtmlString, безусловно, ответ.
мы рассмотрели некоторые другие изменения синтаксиса razor, но в конечном итоге ни один из них не оказался короче новой HtmlString.
мы можем, однако, обернуть это в помощника. Возможно...
@Html.Literal("<p>something</p>")
или
@"<p>something</p>".AsHtml()
я столкнулся с этой проблемой также при переходе нашего проекта на новый движок Razor view. Подход, который я принял, немного отличался, потому что мы должны были генерировать данные JSON из C# и хотели вывести их при загрузке страницы.
что я в конечном итоге сделал, так это реализовать RawView, который был параллельным представлением внутри файлов cshtml. По сути, чтобы получить необработанную строку,
@(new HtmlString(View.Foo)) // became @RawView.Foo
для этого требуется несколько изменений в макете проекта, поэтому я просто написал сообщение в блоге об этом здесь. Короче говоря, для этого потребовалась дублирующая реализация DynamicViewDataDictionary MVC и новая страница WebViewPage, содержащая RawView. Я также пошел вперед и реализовал оператор индекса в RawView, чтобы разрешить
@RawView["Foo"]
в случае, если кто-то должен перебирать данные со списком ключей.
читая комментарий анурса, вероятно, было бы лучше, если бы я назвал это как литерал вместо RawView.