none
ASP.NET4のHTML出力の挙動変更 RRS feed

  • 質問

  • みなさん。はじめまして
    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; は本来は半角ですが、全角にしております。



    2011年7月10日 5:56

回答

  • それをやると Single Quotation のみならず、一切 HtmlEncode されなく
    なってしまうのではないでしょうか?


    その通りです!ご指摘ありがとうございます。
    うっかりしてました。先に紹介したページの一番下の方に、I found this here.という文があり、そのhereをクリックすると以下のページが開きます。

    .Net 4.0 Attributes.Add encoding bug
    http://forums.asp.net/p/1554455/3818604.aspx


    このページの一番最後に&#39をシングルクォートでReplaceしているバージョンがありますので、そちらを使ってください。
    このコードがうまく動作することは確認していたのですが、先に紹介したstackoverflowのページも同じコードが載っていると思い込んでしまっていました。すみません。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2011年7月10日 12:23
    モデレータ

すべての返信

  • 試してませんが、Button.OnClientClickプロパティではどうでしょうか?

    それはそうと、クライアントで処理したいのにサーバーコントロールを使用する必要はあるんでしょうか? 普通に <a onclick="test('hoge')">JSテスト</a> と書くだけなような気もしますが。

    2011年7月10日 6:14
  • 以下のページが参考になりませんか? 対処方法も出ています(未検証です
    が)。

    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

    2011年7月10日 6:35
  • すみません、先のレスで、

    > 対処方法も出ています(未検証ですが)。

    と書きましたが、紹介したページの controlRenderingCompatibilityVersion="3.5"
    は対処方法ではなかったです。

    HTML のレンダリングが 3.5 になるだけで、HtmlEncode に関しては何も変わらない
    ようです。(検証してみました)

    ということで、どうしても  onclick="test('hoge');" にしたいなら ASP.NET に
    HtmlEncode させない手段をとる(例えば、サーバーコントロールは使わず html
    の input 要素の onclick 属性に直接設定)ほかなさそうです。

    でも、onclick="test(&#39;hoge&#39;);" でスクリプトの動作は何ら問題はないは
    ずですが、何故 Single Quotation に HtmlEncode がかかってはまずいのですか?

    2011年7月10日 7:45
  • 以下のようにして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/
    2011年7月10日 7:53
    モデレータ
  • > 以下のようにしてHtmlAttributeEncodeをoverrideすればうまく行きます。

    それをやると Single Quotation のみならず、一切 HtmlEncode されなく
    なってしまうのではないでしょうか?

     

    2011年7月10日 8:48
  • それをやると Single Quotation のみならず、一切 HtmlEncode されなく
    なってしまうのではないでしょうか?


    その通りです!ご指摘ありがとうございます。
    うっかりしてました。先に紹介したページの一番下の方に、I found this here.という文があり、そのhereをクリックすると以下のページが開きます。

    .Net 4.0 Attributes.Add encoding bug
    http://forums.asp.net/p/1554455/3818604.aspx


    このページの一番最後に&#39をシングルクォートでReplaceしているバージョンがありますので、そちらを使ってください。
    このコードがうまく動作することは確認していたのですが、先に紹介したstackoverflowのページも同じコードが載っていると思い込んでしまっていました。すみません。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2011年7月10日 12:23
    モデレータ
  • >佐祐理さん

    返信ありがとございます。

    OnClientClickでも同様の動きでした。

    ASP.NETの移行(3.5→4)を実施しており

    本当は、カスタマコントロール内で、動的に、Javascriptおよび呼び出し先をセット

    しているためです。

     

     

    2011年7月10日 15:20
  • >SurferOnWwwさん

    ありがとうございます。

    ASP.NET4の公式ページは見てませんでした。

    2011年7月10日 15:22
  • >trapemiyaさん

    ありがとうございます。

    試して、結果報告します。

    MSDNフォーラム初めて質問したのですが

    こんなに早くレスがあるとは思ってなかったので。

     

     

    2011年7月10日 15:29
  • 差し支えなければ先のレスの以下の質問に答えていただけないでしょうか?

    > でも、onclick="test(&#39;hoge&#39;);" でスクリプトの動作は何ら問題はないは
    > ずですが、何故 Single Quotation に HtmlEncode がかかってはまずいのですか?

     

    2011年7月11日 13:42
  • 遅くなりました。

    経緯は以下となります。

    ASP.NET(3.5→4)への移行作業

    検証したいものがカスタムコントロールで内部的に動的にjavascriptや、ボタンなどを生成している。

    問題があれば、HTML上で動作確認行い、正常動作確認できれば、動的生成部分を修正。

    理由1 ブラウザのソース表示から、HTMLファイルとしたところ、エラーとなった為。

    理由2 現行のソースと異なる雨。

    理由3 プロジェクトリーダより、修正方法の調査を依頼されたため。

    こんな感じです。

    2011年7月11日 15:44
  • > 理由1 ブラウザのソース表示から、HTMLファイルとしたところ、エラーとなった為。

    エラーになるということでしたら修正せざるを得ないと思いますが、Single Quitation
    が HtmlEncode されてもブラウザは正しく判断するはずで、問題はないと思っていまし
    た・・・

    どういうところでエラーになるか具体的に教えていただけると幸いです。

    2011年7月11日 16:03