私はデータベースから次のテキストを取得しています:(クライアントから提供されたので、私はそれで多くのことをすることができません)
_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()
すると、エンコードされたタグ-_/><
_-が画面に書き込まれます。持っているソーステキストを取得し、タグがテキストではなくHTMLとしてレンダリングされるようにするにはどうすればよいですか?
これを試して:
String Input = "investment professionals.<BR /><BR /> blah blah blah";
String Output = Server.HtmlDecode(Input);
Razorを使用している場合、@ Chevexで説明したように文字列を二重にエンコードします。新しいMVC3を使用する場合<%: %>
構文、二重エンコードも行います。ビューエンジンに関係なく、@ Chevexで記述されたIHtmlStringルート(例:MvcHtmlString)でエンコードを回避するか、別のテンプレート構文を使用してデフォルトのエンコードをバイパスすることができます。
後者は、コードの変更を伴わず、ビューにレンダリングするために使用する構文を微調整するだけです。
Razorの場合:
@Html.Raw(yourvariable)
MVCのデフォルトビューテンプレートシステムの場合:
<%=yourvariable%>
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());
}
これを試すことができます:
String Input = "<p>New Appartments is Avaliable at very Reasonable Price</p>";
String Output = Server.HtmlDecode(Input);
string _output = System.Text.RegularExpressions.Regex.Replace(Output, "<.*?>", string.Empty);
実際に使用したいのはHtml.Decode(string)
です。これにより、<
などのエンコードされた文字が<
に変換されます。
この方法で×を使用するのに苦労していたので、この質問に私の調査結果を追加するだけです。
SetInnerText()はデフォルトですべてのテキストをhtmlエンコードしますが、InnerHtmlは生のhtmlを期待しているので何もエンコードしません。
したがって、これを正しい方法で行った場合、最初にテキスト文字列をデコードして、エンコードされていないタグを取得する必要があります(つまり、<br/>
)そして、これをInnerHtmlプロパティに設定すると、タグはhtmlとしてレンダリングされます。
あなたは次のようなものを持っているでしょう
element.InnerHtml = Server.HtmlDecode(yourText);