web-dev-qa-db-ja.com

エンコードされたタグをテキストではなく適切なHTMLとしてレンダリングする方法は?

私はデータベースから次のテキストを取得しています:(クライアントから提供されたので、私はそれで多くのことをすることができません)

_investment professionals.<BR /><BR /> blah blah blah
_

次のようにレンダリングされます:

_investment professionals.<BR /><BR /> blah blah blah
_

画面に_<BR />_タグを出力したくありません。私はそれらを実際の休憩として振る舞わせたい。

次のHtmlヘルパーコードは、存在するスパンを構築し、それをdivに追加してHTML文字列を返します。

_StringBuilder sbElements = new StringBuilder();

TagBuilder span = new TagBuilder("span") {InnerHtml = subject.AboutText};
sbElements.Append(span.ToString());

TagBuilder div = new TagBuilder("div");
div.MergeAttribute("class", "about-text");
div.InnerHtml = sbElements.ToString();

return div.ToString();
_

ヘルパーメソッドの出力をHtml.Encode()すると、エンコードされたタグ-_/&gt;&lt;_-が画面に書き込まれます。持っているソーステキストを取得し、タグがテキストではなくHTMLとしてレンダリングされるようにするにはどうすればよいですか?

22
DaveDev

これを試して:

    String Input = "investment professionals.&lt;BR /&gt;&lt;BR /&gt; blah blah blah";

    String Output = Server.HtmlDecode(Input);
19
Steve Wellens

Razorを使用している場合、@ Chevexで説明したように文字列を二重にエンコードします。新しいMVC3を使用する場合<%: %>構文、二重エンコードも行います。ビューエンジンに関係なく、@ Chevexで記述されたIHtmlStringルート(例:MvcHtmlString)でエンコードを回避するか、別のテンプレート構文を使用してデフォルトのエンコードをバイパスすることができます。

後者は、コードの変更を伴わず、ビューにレンダリングするために使用する構文を微調整するだけです。

Razorの場合:

@Html.Raw(yourvariable)

MVCのデフォルトビューテンプレートシステムの場合:

<%=yourvariable%>
32
patridge

Return div.ToString()MvcHtmlString.Create(div.ToString())に変更し、メソッドの戻りタイプをMvcHtmlStringではなくstringに変更します。これにより、ビューエンジンが自動的に出力をエンコードしないようにします。

MvcHtmlStringを返すことは、ヘルパーメソッドを介してHTML出力をレンダリングするための標準的な方法です。

何が起こっているのかは、データベースから値をデコードしており、表示エンジンはレンダリング時に値を再エンコードしているということです。 Razorビューエンジンは、MvcHtmlStringでない限り、ビューの出力を自動的にHTMLエンコードします。 MvcHtmlStringを返すと、その発生が停止します。

public static MvcHtmlString MyNonHtmlEncodedOutput(this HtmlHelper html)
{
        StringBuilder sbElements = new StringBuilder();

        TagBuilder span = new TagBuilder("span") {InnerHtml = Server.HtmlDecode(subject.AboutText)};
        sbElements.Append(span.ToString());

        TagBuilder div = new TagBuilder("div");
        div.MergeAttribute("class", "about-text");
        div.InnerHtml = sbElements.ToString();

        return MvcHtmlString.Create(div.ToString());
}
10
Chev

これを試すことができます:

 String Input = "&lt;p&gt;New Appartments is Avaliable at very Reasonable Price&lt;/p&gt;";
 String Output = Server.HtmlDecode(Input);
 string _output = System.Text.RegularExpressions.Regex.Replace(Output, "<.*?>", string.Empty);
6
Shahnila

実際に使用したいのはHtml.Decode(string)です。これにより、&lt;などのエンコードされた文字が<に変換されます。

2
realistschuckle

この方法で×を使用するのに苦労していたので、この質問に私の調査結果を追加するだけです。

SetInnerText()はデフォルトですべてのテキストをhtmlエンコードしますが、InnerHtmlは生のhtmlを期待しているので何もエンコードしません。

したがって、これを正しい方法で行った場合、最初にテキスト文字列をデコードして、エンコードされていないタグを取得する必要があります(つまり、<br/>)そして、これをInnerHtmlプロパティに設定すると、タグはhtmlとしてレンダリングされます。

あなたは次のようなものを持っているでしょう

element.InnerHtml = Server.HtmlDecode(yourText);
1
ScottGuymer