7

私はこれについて数日間頭を悩ませてきましたが、それが私の環境の問題なのか、ASP.NET MVC に基づいているコード自体の問題なのかはわかりません (ただし、C# で 5 年の経験があります)。Win7x64 と VS 2008 の最新のクリーン インストールとすべてのパッチを使用しています。

私が制御できないいくつかのルールに基づいて、コントローラーによって選択的に読み込まれるデータベーステーブルに未加工の HTML が保存されています。残念ながら、次のようなコントロールのビュー データに値を詰め込もうとすると、次のようになります。

ViewData["HTMLData"] = DAO.HTMLDataGet();

出力を見ると、エスケープ/HTML エンコードされています。次のすべてを使用してみましたが、この問題は解決していないようです。

<%: HttpUtility.HtmlDecode(ViewData["HTMLData"].ToString())%>

と...

<%: Server.HtmlDecode(ViewData["HTMLData"].ToString())%>

と...

<%: Html.Raw(ViewData["HTMLData"].ToString())%>

...データベーステーブルから生のHTMLをうまく取得しますが、何を試しても、その爆破されたエンコーディングを強制し続けます。私が MSDN で読んだことによると、HTML が適切にデコードされず、スペースが含まれているために発生する問題についての脚注がありました (私の場合はそうです)。これに直面したのは私だけではないと思うので、皆さんにアイデアを求めています。

ページのクリーンアップを行うために正規表現を使用して自分の道を歩もうとしていますが、力ずくで実行する前に、まず他の人からアドバイスを得る方がよいと考えました。よろしくお願いします。

4

3 に答える 3

16

<%: 「必要に応じてエンコードする」という意味です。それを望まない場合は、怠惰なアプローチを使用する<%=ことですが、率直に言って、代わりにIHtmlString、たとえば次のようにラップすることをお勧めします。

string yourEncodedHtml = ...
var html = new MvcHtmlString(yourEncodedHtml);

さて、それを保存て表示すると、htmlを「そのまま」取得する必要があります。

于 2012-08-20T07:20:32.680 に答える
8

使用してみてください: <%=%>

<%= Html.Raw(ViewData["HTMLData"].ToString())%>

<%:%>は、ASP.NET 4(およびASP.NET MVC)でのHTMLエンコード出力の構文です。

詳細については

今日コンテンツをHTMLエンコードする方法

ASP.NETアプリケーション(特にASP.NET MVCを使用するアプリケーション)は、多くの場合、<%=%>コードナゲット式を使用して出力をレンダリングします。今日の開発者は、これらの式内でServer.HtmlEncode()またはHttpUtility.Encode()ヘルパーメソッドを使用して、出力をレンダリングする前にHTMLエンコードすることがよくあります。

これは正常に機能しますが、2つの欠点があります。

これは少し冗長です。開発者はServer.HtmlEncodeメソッドの呼び出しを忘れることがよくあります。また、アプリ全体での使用状況を確認する簡単な方法はありません。

新しい<%:%>コードナゲット構文

ASP.NET 4では、 <%=%>ブロックのように出力をレンダリングする新しいコード式構文( <%:%> )を導入していますが、これは、実行する前にHTMLで自動的にエンコードします。これにより、コンテンツを明示的にHTMLエンコードする必要がなくなります。

<%=%>コードブロックの既存のインスタンスをすばやく簡単に置き換えることができるように、<%:%>構文を選択しました。また、コードベースで<%=%>要素を簡単に検索して、アプリケーション内でHTMLエンコーディングを使用していない場合を見つけて検証し、正しい動作をしていることを確認できます。

于 2012-08-20T07:25:27.850 に答える
0

あなたが試したことで、あなたはほとんどそれを手に入れました。これを行うというアイデアを私に与えてくれました。

Html.Raw(HttpUtility.HtmlDecode(ViewData["HTMLData"].ToString()))
于 2022-02-04T19:10:25.270 に答える