エンコードなしのASP.NET MVC Razorレンダリング


250

Razorはデフォルトで文字列をエンコードします。エンコーディングなしでレンダリングするための特別な構文はありますか?

回答:


374

ASP.NET MVC 3以降、次のものを使用できます。

@Html.Raw(myString)

8
これは完全に正しいわけではありません。はい、生の文字列を挿入できますが、"'<>etc...これらがある場合はエスケープされます。正しい方法は、「不正な」文字を許可するMvcHtmlStringを使用することです。たとえば、モデル全体をエンコードせずにJsonデータをエンコードする場合
Daniel B. Chapman

4
Daniel、Html.Raw() "HTMLエンコードされていないマークアップを返します。"
Lucas

1
Html.Raw()は引用符をエンコードします..."myAttr='hello';myInt=10"
Serge

4
引用符はエンコードしません。(プレーンな日として、それを述べ明らか資料の他、「レンダリングIHtmlStringクラス、使用してこの方法ラップHTMLマークアップエンコードされていない HTMLを。」)また、私はこれをテストし、引用符がエンコードされていません。
James Wilkins、2017


31

すでに述べた@ Html.Raw(string)のアプローチと同様に、MvcHtmlStringを出力する場合、エンコードされません。これは、HtmlHelperに独自の拡張機能を追加する場合、またはHTMLが含まれている可能性があることがわかっているビューモデルから値を返す場合に役立ちます。

たとえば、ビューモデルが次の場合:

public class SampleViewModel
{
  public string SampleString { get; set; }
  public MvcHtmlString SampleHtmlString { get; set; }
}

Core 1.0+(およびMVC 5+)の場合、HtmlStringを使用します

public class SampleViewModel
{
  public string SampleString { get; set; }
  public HtmlString SampleHtmlString { get; set; }
}

その後

<!-- this will be encoded -->
<div>@Model.SampleString</div>
<!-- this will not be encoded -->
<div>@Html.Raw(Model.SampleString)</div>
<!-- this will not be encoded either -->
<div>@Model.SampleHtmlString</div>

10

@Html.Raw()エンコーディングとセキュリティでさらに問題が発生する可能性があるため、注意して使用してください。私はこれを自分でしなければならなかったのでユースケースを理解していますが、注意深く...すべてのテキストを通過させないようにしてください。たとえば、特定の文字シーケンスのみを保持/変換し、残りを常にエンコードします。

@Html.Raw(Html.Encode(myString).Replace("\n", "<br/>"))

そうすれば、潜在的なセキュリティホールを作成しておらず、すべてのブラウザで特殊文字や外来文字が正しく表示されるので安心です。


+1まさに私が必要とするもの!文字列はエンコードする必要がありますが、改行はhtmlである必要があります。ありがとう!
Peter

@Html.Raw(Html.Encode(myString).Replace(Html.Encode("\n"), "<br/>"))for ASP.NET Core
kenjiuno 2018年

5

ActionLinkの場合、通常はリンクテキストにHttpUtility.Encodeを使用します。その場合 HttpUtility.HtmlDecode(myString) 、HtmlActionLinkを使用して、渡したい文字列をデコードするときにそれが機能しました。例えば:

  @Html.ActionLink(HttpUtility.HtmlDecode("myString","ActionName",..)



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.