トップ回答者
WEBカスタムコントロールの作成について

質問
-
初投稿になります。
よろしくお願いいたします。
なんらかの不備等があれば ご指摘いただけたらと思います。
さっそく質問なのですが
VS2005で あるテキストボックスの入力を ラベルに反映させるWEBカスタムコントロールを作成しようとしています。
一通りの想定した処理はできるようになったのですが(自分で作っておいて何ですが)疑問に感じる部分があり質問したいのです。基本的に描画はRenderContents をオーバーライドした部分で描画をしているのですが、このタイミングでページに対してクライアントスクリプトブロックを吐き出そうとしても既にページ側のレンダが終わっているのかクライアントスクリプトが吐き出されないようなのです。
(もちろん勘違いの可能性もありますが・・・・)その為、現在はOnPreRender をオーバーライドしてその中でクライアントスクリプトの出力を行っているのですがこれは適切なのでしょうか?
流れ的にOnPreRenderでは以下のような処理を行っています。
Page.RegisterClientScriptBlock でTextBoxの内容をラベルに反映するJavaScriptの関数を出力
↓
PageのあるTextBoxオブジェクトを取得
↓
TextBoxのクライアント側OnkeyUpイベントで上記で作成した関数を呼ぶように設定またTextBoxはIDをString型のプロパティで受取り、PageのFindControlで取得しています。
以上になります。
説明が下手で申し訳ないのですが、お分かりになる方がいらっしゃったらご教授願えませんでしょうか?
回答
-
たると さんからの引用 基本的に描画はRenderContents をオーバーライドした部分で描画をしているのですが、このタイミングでページに対してクライアントスクリプトブロックを吐き出そうとしても既にページ側のレンダが終わっているのかクライアントスクリプトが吐き出されないようなのです。
(もちろん勘違いの可能性もありますが・・・・)おっしゃられている通り、RenderContents でRegisterClientScriptBlockを実行しても、
JavaScriptの内容が吐き出されないです。
言い方を変えると、OnPreRenderより前の段階で行う必要があります。
また、OnPreRender でJavaScriptの書き出しを行っても良いのですが、
作成中のコントロールに特に問題がないのであれば、OnInitやOnLoadで、RegisterClientScriptBlockを実行しても
良いのかなと思います。
そこは作っているコントロールの機能や仕様によっても左右されるので、
こうしなさい というものはないのですが、ケースバイケースですね。
それから、本件とは関係ないのですが、VS2005(.NET Framework 2.0) では、
Page.RegisterClientScriptBlock ではなく、ClientScriptManager.RegisterClientScriptBlock を使う方を
推奨されていたと思いますので、できるのであれば、ClientScriptManager.RegisterClientScriptBlock を使って下さい。
http://msdn.microsoft.com/ja-jp/library/btf44dc9.aspx
宜しくお願いします。
すべての返信
-
たると さんからの引用 基本的に描画はRenderContents をオーバーライドした部分で描画をしているのですが、このタイミングでページに対してクライアントスクリプトブロックを吐き出そうとしても既にページ側のレンダが終わっているのかクライアントスクリプトが吐き出されないようなのです。
(もちろん勘違いの可能性もありますが・・・・)おっしゃられている通り、RenderContents でRegisterClientScriptBlockを実行しても、
JavaScriptの内容が吐き出されないです。
言い方を変えると、OnPreRenderより前の段階で行う必要があります。
また、OnPreRender でJavaScriptの書き出しを行っても良いのですが、
作成中のコントロールに特に問題がないのであれば、OnInitやOnLoadで、RegisterClientScriptBlockを実行しても
良いのかなと思います。
そこは作っているコントロールの機能や仕様によっても左右されるので、
こうしなさい というものはないのですが、ケースバイケースですね。
それから、本件とは関係ないのですが、VS2005(.NET Framework 2.0) では、
Page.RegisterClientScriptBlock ではなく、ClientScriptManager.RegisterClientScriptBlock を使う方を
推奨されていたと思いますので、できるのであれば、ClientScriptManager.RegisterClientScriptBlock を使って下さい。
http://msdn.microsoft.com/ja-jp/library/btf44dc9.aspx
宜しくお願いします。