Razorビューでエンコードされていない文字列を出力する


81

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

簡単にするために、plsはこの単純なケースに固執します:

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

回答:



17

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

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

うまくいけば、Razorの将来にはもっと簡単な方法があるでしょう。

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

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

2
実際にあなたが使用することはできsouldnew HtmlString()そのタイプので、うまくとしてMVC 3で、.NET 4である
marcind

確かに!ただし、これらすべてを1つの式に入力すると、MVCがもう1つ気に入っています。例:@ MvcHtmlString.Create(myString)。個人の好み!
aolde 2010

6

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

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

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

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

または

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

1
HTMLを出力する方法として@ = myStringを追加することは可能でしょうか?たぶん、あまりにも多くのWebフォームへのフラッシュバックの...
aolde

2
主要なユーザーケースをカバーしていない構文構造を追加することは避けたいと思います。ほとんどの場合、ヘルパーメソッドを使用して文字列を作成し、IHtmlStringはそこで完全に機能します。ヘルパーなしでリテラル文字列を出力する必要があるという奇妙なケースのために、@ Literal(foo)などのメソッドを提供できます。
AndrewStanton-Nurse

0

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

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

@(new HtmlString(View.Foo))

// became
@RawView.Foo

私はちょうどそれについてのブログ記事を書いたので、これは、プロジェクトのレイアウトにいくつかの変更を必要とし、ここで。つまり、これにはMVCのDynamicViewDataDictionaryの重複実装と、RawViewを含む新しいWebViewPageが必要でした。また、RawViewにインデックス演算子を実装して、

@RawView["Foo"]

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

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


0

MonoでASP.NETMVCとRazorを使用しています。

何らかの理由で、System.Web.MvcのSystem.Web.WebPagesからHtmlHelperを取得できませんでした。

しかし、モデルのプロパティをとして宣言した後、エンコードされていない文字列を出力することができました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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.