asp.net mvcビューで文字列をHTMLとして表示する


98

htmlマークアップを含む文字列を生成するコントローラーがあります。ビューに表示すると、すべてのタグを含む単純な文字列として表示されます。Htmlヘルパーを使用してエンコード/デコードして適切に表示しようとしましたが、機能しません。

string str= "<a href="/Home/Profile/seeker">seeker</a> has applied to <a href="/Jobs/Details/9">Job</a> floated by you.</br>";

私の見解では、

@Html.Encode(str)

6
Html.Rawは助けるべきだと思います。
Saeed Neamati 2013年

またHtmlStrin、次のようにクラスを使用できると思いますHtmlString str = new HtmlString("<span>Some HTML here</span>");
Saeed Neamati

回答:


168

あなたはあなたが使いたいあなたに近いです @Html.Raw(str)

@Html.Encode文字列を受け取り、すべての特殊文字が適切に処理されるようにします。これには、スペースなどの文字が含まれます。


6
@ Html.Rawはまさに私が探していたもので、回答に感謝します:)
AFract

@Jerad RoseによるIHtmlStringの方がはるかに優れています
Pratyush Dhanuka

37

IHtmlString代わりに使用する必要があります:

IHtmlString str = new HtmlString("<a href="/Home/Profile/seeker">seeker</a> has applied to <a href="/Jobs/Details/9">Job</a> floated by you.</br>");

HTMLを保持する必要のあるモデルプロパティまたは変数がある場合は常に、これが一般的にはより良い方法だと思います。まず第一に、それは少しきれいです。例えば:

@Html.Raw(str)

に比べ:

@str

また、@Html.Raw()データがHTMLかどうかの懸念はコントローラーに保持されるため、を使用するよりも少し安全だと思います。フロントエンド開発者とバックエンド開発者がいる環境では、バックエンド開発者は、どのデータがHTML値を保持できるかを調整しているため、この問題をバックエンド(コントローラー)で維持できます。

私は通常、Html.Raw()可能な限り使用しないようにしています。

もう1つ注目すべきことは、どこに割り当てるかがわからないことですstrが、これを実装する方法について私に関係するいくつかの点があります。

まず、これは、ソリューション(IHtmlStringまたはHtml.Raw)に関係なく、コントローラーで行う必要があります。このようなロジックは実際にはそこに属していないため、ビューでは避けてください。

さらに、ViewModelビューに値を取得するためにを使用する必要があります(また、理想的にIHtmlStringはプロパティタイプとして使用します)。@Html.Encode(str)例を単純化するためだけにこれを行っていなかった場合を除いて、何かを見るのは少し心配です。


1
コントローラはルーティング用であり、データストレージ用ではないことを指摘しておきます。さらに、バックエンドの開発者は、コードの既存のコントラクトを変更するよりもよく知っている必要があります。UIはモデルにバインドする必要があり、モデルが大幅に変更された場合、ユニットテストは失敗します。
Anthony Mason

ご回答有難うございます。私はそれが好きです。
Thomas.Benz 2017

ええ、この答えははるかに優れています。私は最初にHtml.Rawを使用しましたが、この答えを読んだとき、すぐに切り替えました
Pratyush Dhanuka '20

7

あなたは使うことができます @Html.Raw(str)

詳細については、MSDNを参照してください

HTMLエンコードされていないマークアップを返します。

このメソッドは、エンコードされていないHTMLをレンダリングするIHtmlStringクラスを使用してHTMLマークアップをラップします。


1

MVCのHTML入力フィールドにも同様の問題がありました。ページングされたWebは、フィールドの最初のキーワードのみを示しました。例:入力フィールド: "The quick brown fox"表示される値: "The"

解決策は、次のように変数をvalueステートメントで引用符で囲むことでした。

<input class="ParmInput" type="text" id="respondingRangerUnit" name="respondingRangerUnit"
       onchange="validateInteger(this.value)" value="@ViewBag.respondingRangerUnit">

0

私は最近同様の問題を抱えていて、グーグルが私をここに上陸させたので、完全を期すために他の人もここに上陸した場合に備えて、この答えをここに置いた。

htmlの形式が不適切な場合、実際にはすべてのhtmlタグが取り除かれ非タグコンテンツのみが残っていることに気付きました。特に、開始テーブルタグが欠落しているテーブルがあり、文字列全体のすべてのHTMLタグが完全に取り除かれていました。

したがって、上記が機能せず、まだ頭を悩ましている場合は、htmlが有効かどうかも確認してください

動作させた後でも、MVCがtbodyタグを追加していないのに気づきました。これにより、クリーンアップが行われている(MVC 5)ことがわかり、それができない場合は、すべてまたは一部のタグが削除されます。

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