トップ回答者
ClientScriptManager.RegisterStartupScript メソッド

質問
-
いつも参考にさせていただいていますが、初の投稿になります。
質問ですが
ClientScriptManager.RegisterStartupScript メソッドについての質問です。
FrameWork2.0から新しくなったこのメソッドなのですがMSDNにある中で、第一引数の ”type As Type”
の解説にある”登録する起動スクリプトの型。”と書かれている部分の言い回しが判りません。
WEBで検索をかけて調べたところ、Me.GetTypeを使用しているサイトばかりでした。
しかしながら、何故この引数にMe.GetTypeを設定する理由がわかりません。
もしどなたかご存知の方がいらっしゃいましたら、ご教授お願いできませんか?
環境はASP.NET2.0(VB)になります。
MSDNの参照ページ
回答
-
S.Nakanoと申します。
私も現在ASP.NET1.1から2.0へ移植をして、本メソッドのType引数の存在に???を感じていました。結論から言うとType引数には、何を指定してもかまわないと思います。リファレンスのとおりあくまでも重複を管理するためのキーに過ぎません。GetType(Integer)でもいいわけです。ではなぜこんなもののが追加されたのかということについてですが、おそらくマスターページやユーザーコントロールをフル活用していくと、登録スクリプトのキー管理が混乱してくるからだと思います。
例としてマスターページで"A"というキーのスタートアップスクリプトを登録します。Page.ClientScript.RegisterStartupScript(me.GetType(), "A", "alert('master');", True)同様にそのマスターページ内のコンテナ(sample.aspx)で"A"というキーのスタートアップスクリプトを登録します。Page.ClientScript.RegisterStartupScript(me.GetType(), "A", "alert('page');", True)sample.aspxに要求を出した場合ですが、それぞれのTypeに指定されているmeはマスターページ、sample.aspx、各々のクラスとなりますので結果として違うタイプ(別キー)となり、ブラウザレスポンス時には"master"と"page"、両方のアラートが表示されるでしょう。
ところが、もしこの「Type引数がなければ」ということを仮定してsample.aspxのスクリプト登録処理の記述を以下のように変えてみます。Page.ClientScript.RegisterStartupScript(me.Master.GetType(), "A", "alert('page');", True)これで両者のスクリプトは同じキーとなってしまったので、sample.aspxに要求を出してもブラウザレスポンス時には"master"と"page"、どちらか早くに登録されたほう(おそらく"page"のほう)しかアラートが表示されないでしょう。
今回Type引数が増え、お約束的にme.GetType()と指定することにより、キー名(今回の例でいうと"A")はそのページ(クラス)内で一意にすればいいことになり、同ページに混在するマスターページや、ユーザーコントロール内のキー名との重複を意識する必要がなくなります。逆に言うとType引数がないと、せっかくマスターページやユーザーコントロールでコンテンツを部品化しても、組み合わせる部品内の実装までを意識してキー名の決定をしていかなくてはいけません。 マスターページはASP.NET2.0からですが、ASP.NET1.1でのユーザーコントロールでも同問題が発生します。ですので決して意味のないものではなく、むしろ進化したありがたい引数なのです。
すべての返信
-
そのページに、
起動スクリプトは、そのキーと型で一意に識別されます。同じキーと型を持つスクリプトは重複していると見なされます。同じ型とキーのペアを持つスクリプトは、同じページに 1 つだけ登録できます。既に登録されているスクリプトを登録しようとしても、重複したスクリプトは作成されません。
IsStartupScriptRegistered メソッドを呼び出して、任意のキーと型のペアを持つ起動スクリプトが既に登録されていないか確認し、スクリプトを不要に追加しようとする手間を省きます。
とありますが。
-
Hongliang さんからの引用 起動スクリプトは、そのキーと型で一意に識別されます。同じキーと型を持つスクリプトは重複していると見なされます。同じ型とキーのペアを持つスクリプトは、同じページに 1 つだけ登録できます。既に登録されているスクリプトを登録しようとしても、重複したスクリプトは作成されません。
IsStartupScriptRegistered メソッドを呼び出して、任意のキーと型のペアを持つ起動スクリプトが既に登録されていないか確認し、スクリプトを不要に追加しようとする手間を省きます。
早速のご返信ありがとうございます。
その文章の部分をもう一度見直してみたところ、あくまでページ内で2つのキーの内容がかぶらなければ
Type引数に特に何を設定しても構わないということになるのでしょうか?
例えばページ内で”Me.GetType”を使った場合、ページ内でKeyさえ重複しなければよいという解釈で構わないのでしょうか?
-
S.Nakanoと申します。
私も現在ASP.NET1.1から2.0へ移植をして、本メソッドのType引数の存在に???を感じていました。結論から言うとType引数には、何を指定してもかまわないと思います。リファレンスのとおりあくまでも重複を管理するためのキーに過ぎません。GetType(Integer)でもいいわけです。ではなぜこんなもののが追加されたのかということについてですが、おそらくマスターページやユーザーコントロールをフル活用していくと、登録スクリプトのキー管理が混乱してくるからだと思います。
例としてマスターページで"A"というキーのスタートアップスクリプトを登録します。Page.ClientScript.RegisterStartupScript(me.GetType(), "A", "alert('master');", True)同様にそのマスターページ内のコンテナ(sample.aspx)で"A"というキーのスタートアップスクリプトを登録します。Page.ClientScript.RegisterStartupScript(me.GetType(), "A", "alert('page');", True)sample.aspxに要求を出した場合ですが、それぞれのTypeに指定されているmeはマスターページ、sample.aspx、各々のクラスとなりますので結果として違うタイプ(別キー)となり、ブラウザレスポンス時には"master"と"page"、両方のアラートが表示されるでしょう。
ところが、もしこの「Type引数がなければ」ということを仮定してsample.aspxのスクリプト登録処理の記述を以下のように変えてみます。Page.ClientScript.RegisterStartupScript(me.Master.GetType(), "A", "alert('page');", True)これで両者のスクリプトは同じキーとなってしまったので、sample.aspxに要求を出してもブラウザレスポンス時には"master"と"page"、どちらか早くに登録されたほう(おそらく"page"のほう)しかアラートが表示されないでしょう。
今回Type引数が増え、お約束的にme.GetType()と指定することにより、キー名(今回の例でいうと"A")はそのページ(クラス)内で一意にすればいいことになり、同ページに混在するマスターページや、ユーザーコントロール内のキー名との重複を意識する必要がなくなります。逆に言うとType引数がないと、せっかくマスターページやユーザーコントロールでコンテンツを部品化しても、組み合わせる部品内の実装までを意識してキー名の決定をしていかなくてはいけません。 マスターページはASP.NET2.0からですが、ASP.NET1.1でのユーザーコントロールでも同問題が発生します。ですので決して意味のないものではなく、むしろ進化したありがたい引数なのです。