トップ回答者
ASP.NET4のHTML出力の挙動変更

質問
-
みなさん。はじめまして
ASP.NET4について質問があります。
質問概要>ASP.NET3.5→4への移行をしております。
ASP.NET4でサーバコントロール属性に設定した文字列に
含まれるシングルクォーテーションの出力のされ方が異なっており
対応方法に難儀しております。①シングルクォーテーションを置き換えさせないようにできないでしょうか?
②仕様なんでしょうか?
質問詳細>
サーバコントロールのButton,HyperLink等に
JavascriptのAメソッドを呼びだす用に設定すると
クライアント側で、Aメソッドが実行されます。
ただ、ブラウザのソースの表示で内容を見ると
シングルクォーテーション→「'」置き換わってしまいます。
ただ、ASP>NET3.5では、では置き換わりません。要件>
サーバサイドで動的にコントロールを貼り付け
属性を設定する。その時にボタン押下のJavascript
を呼び出すように設定したい。環境>
VS2010 sp1未適応
ソリューション:webアプリケーション
言語:C#
ターゲット:ASP.NET4 .netframework4
使用ブラウザ:IE8、FF5ボタン割り当て処理>
lbtnTest.Attributes.Add("onclick", "test('hoge');");呼び出したいJavascript>
<script type="text/javascript">
function test(msg)
{
alert(msg);
}
</script>実際にブラウザで表示させ、ソースの表示で確認
<a onclick="test(&#39;hoge&#39;);" id="lbtnTest" href="javascript:__doPostBack('lbtnTest','')">JSテスト</a><a onclick="test('hoge');"になってほしいのですが。
余談ですが、aspxファイルにAタブを書いた場合は、置き換わりません。&#39; は本来は半角ですが、全角にしております。
回答
-
それをやると Single Quotation のみならず、一切 HtmlEncode されなく
なってしまうのではないでしょうか?
その通りです!ご指摘ありがとうございます。
うっかりしてました。先に紹介したページの一番下の方に、I found this here.という文があり、そのhereをクリックすると以下のページが開きます。.Net 4.0 Attributes.Add encoding bug
http://forums.asp.net/p/1554455/3818604.aspx
このページの一番最後に'をシングルクォートでReplaceしているバージョンがありますので、そちらを使ってください。
このコードがうまく動作することは確認していたのですが、先に紹介したstackoverflowのページも同じコードが載っていると思い込んでしまっていました。すみません。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/- 回答としてマーク 関西人のおっさんT 2011年7月11日 15:44
すべての返信
-
試してませんが、Button.OnClientClickプロパティではどうでしょうか?
それはそうと、クライアントで処理したいのにサーバーコントロールを使用する必要はあるんでしょうか? 普通に <a onclick="test('hoge')">JSテスト</a> と書くだけなような気もしますが。
-
以下のページが参考になりませんか? 対処方法も出ています(未検証です
が)。ASP.NET 4.0 DropDownList with single quotes in text
http://stackoverflow.com/questions/5931605/asp-net-4-0-dropdownlist-with-single-quotes-in-text
なぜ ASP.NET 3.5 と違うかは以下のページを見てください。ASP.NET 4 Breaking Changes
http://www.asp.net/learn/whitepapers/aspnet4/breaking-changes -
すみません、先のレスで、
> 対処方法も出ています(未検証ですが)。
と書きましたが、紹介したページの controlRenderingCompatibilityVersion="3.5"
は対処方法ではなかったです。HTML のレンダリングが 3.5 になるだけで、HtmlEncode に関しては何も変わらない
ようです。(検証してみました)ということで、どうしても onclick="test('hoge');" にしたいなら ASP.NET に
HtmlEncode させない手段をとる(例えば、サーバーコントロールは使わず html
の input 要素の onclick 属性に直接設定)ほかなさそうです。でも、onclick="test('hoge');" でスクリプトの動作は何ら問題はないは
ずですが、何故 Single Quotation に HtmlEncode がかかってはまずいのですか? -
以下のようにしてHtmlAttributeEncodeをoverrideすればうまく行きます。
Stop the tag builder escaping single quotes ASP.NET MVC 2
http://stackoverflow.com/questions/3924861/stop-the-tag-builder-escaping-single-quotes-asp-net-mvc-2シングルクォートは.NET 4.0でHtmlEncodeの対象に含まれたようですね。
HtmlEncode and UrlEncode Now Encode Single Quotation Marks
http://www.asp.net/learn/whitepapers/aspnet4/breaking-changes#0.1__Toc256770143また、他の方も書かれていますが、動作自体はHtmlEncodeされた状態でも問題ありませんので、上記のようにして無理に変える必要はないのではないかと思います。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/ -
それをやると Single Quotation のみならず、一切 HtmlEncode されなく
なってしまうのではないでしょうか?
その通りです!ご指摘ありがとうございます。
うっかりしてました。先に紹介したページの一番下の方に、I found this here.という文があり、そのhereをクリックすると以下のページが開きます。.Net 4.0 Attributes.Add encoding bug
http://forums.asp.net/p/1554455/3818604.aspx
このページの一番最後に'をシングルクォートでReplaceしているバージョンがありますので、そちらを使ってください。
このコードがうまく動作することは確認していたのですが、先に紹介したstackoverflowのページも同じコードが載っていると思い込んでしまっていました。すみません。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/- 回答としてマーク 関西人のおっさんT 2011年7月11日 15:44