82

ScottGu がブログ投稿で述べているように、 「デフォルトでは、@ ブロックを使用して出力されたコンテンツは自動的に HTML エンコードされ、XSS 攻撃のシナリオからより適切に保護されます」。私の質問は、HTML でエンコードされていない文字列をどのように出力できますか?

簡単にするために、次の単純なケースに固執します。

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

5 に答える 5

114

これは私のお気に入りのアプローチです:

@Html.Raw("<p>my paragraph text</p>")

ソースはPhilHaackのRazor構文リファレンスでした:http://haacked.com/archive/2011/01/06/razor-syntax-quick-reference.aspx

于 2011-02-07T22:47:28.637 に答える
17

HTML エンコードされない MvcHtmlString の新しいインスタンスを作成できます。

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

Razor の将来により簡単な方法が提供されることを願っています。

MVC を使用していない場合は、これを試すことができます。

@{
  var html = new HtmlString("<a href='#'>Click me</a>")
}
于 2010-07-28T20:46:19.763 に答える
6

新しいHtmlStringが間違いなく答えです。

他のいくつかのかみそりの構文の変更を調べましたが、最終的には、新しいHtmlStringよりも実際に短くなるものはありませんでした。

ただし、それをヘルパーにまとめることはできます。おそらく...

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

また

@"<p>something</p>".AsHtml()
于 2010-07-29T01:15:05.010 に答える
0

プロジェクトを新しい Razor ビュー エンジンに移行するときにも、この問題に遭遇しました。C# から JSON データを生成する必要があり、ページの読み込み時にそれを出力したかったため、私が取ったアプローチは少し異なりました。

私が最終的に行ったのは、cshtml ファイル内の View に相当する RawView を実装することでした。基本的に、生の文字列を取得するには、

@(new HtmlString(View.Foo))

// became
@RawView.Foo

これにはプロジェクトのレイアウトにいくつかの変更が必要なので、ここにブログ投稿を書きました。つまり、これには、MVC の DynamicViewDataDictionary の複製実装と、RawView を含む新しい WebViewPage が必要でした。また、RawView にインデックス演算子を実装して、

@RawView["Foo"]

万が一、誰かがキーのリストを使用してデータをループする必要がある場合。

anurse さんのコメントを読むと、RawView ではなく、Literal という名前を付けた方がよかったのではないでしょうか。

于 2010-08-18T22:21:19.967 に答える