ソリューションの作成
今回は1つのソリューション内にプロジェクトとWebサイト両方を作成します。[ファイル]-[追加]-[新しいWebサイト]を選択してください。ASP.NET AJAXのコントロールを自作して利用するので、Webサイトテンプレートの「Default.aspx」にScriptManager(またはToolkitScriptManager)が配置されている[AJAX Control Toolkit Web Site]か[ASP.NET AJAX-Enabled Web Site]のテンプレートを選びましょう。どちらでも構いませんが、ここでは[AJAX Control Toolkit Web Site]を選択します。
なお、このまま実行すると、先に作成された[ASP.NET AJAX Control Project]プロジェクト(クラスライブラリプロジェクト)が実行されてしまい、エラーが発生してしまいます。エラーを回避するために追加したWebサイトを右クリックして、[スタートアップ プロジェクトに設定]を選択し、Webサイトが実行されるように設定しましょう。
Extenderコントロールに必要な記述
[ASP.NET AJAX Control Project]プロジェクトが生成するファイルは、テンプレートでコードが自動生成されます。その中でいくつか肝となる部分がありますので、「Extender.vb」ファイルと「Behavior.js」ファイルの2点に焦点を絞って紹介します。
まずはじめに、Extenderコントロールの作成に必要な記述として「Extender.vb」を説明します。実際にどのように記述するかも併記しますので、確認してください。
- AjaxControlToolkit名前空間の定義
- 自作Extenderコントロールの名前空間の定義
- 自作Extenderコントロール上で利用するJavaScriptファイルのリソース登録
- 自作Extenderコントロールのフォームデザイナ上のデザインを指定したファイルの登録
ExtenderControlBaseクラスのインスタンスを指定したJavaScriptファイルと紐付けるTargetControlIDプロパティとして設定するコントロールを指定- 自作Extenderコントロールクラスを作る際に、
ExtenderControlBaseクラスの継承 - Extender.vbファイル上のプロパティとBehavior.jsファイルのプロパティを連動するための設定
- プロパティ設定の中で、Behavior.jsファイルと値を共有するためのメソッドの記述
Imports AjaxControlToolkit
Namespace [名前空間名(既定ではプロジェクト名)]
<Assembly: System.Web.UI.WebResource("[プロジェクト名].[Behaviorファイル名].js", "text/javascript")>
<Designer(GetType([Designerファイル名]))>
<ClientScriptResource("[プロジェクト名].[Behaviorファイル名]","[プロジェクト名]. [Behaviorファイル名].js")>
<TargetControlType(GetType(クラス名))>
Inherits ExtenderControlBase
<ExtenderControlProperty()>
GetPropertyValue("プロパティ名", 値) SetPropertyValue("プロパティ名", value)
TargetControlIDプロパティにボタン系コントロールを設定できるようになります。続いて「Behavior.js」について説明します。
- Extender.vbファイル上で定義した名前空間の定義.
- Behavior.jsファイルのクラスのコンストラクタを作成(初期化設定の記述内で、次の構文を書く必要がある)
- 継承元すべてのメンバを[名前空間名].[クラス名]のクラスに引き継ぎ初期化(
initializeBase関数はMicrosoft AJAX Libraryの中で定義されている関数) - [クラス名]クラスの定義を行う(この中にイベントハンドラ、関数、プロパティなどを記述する)
- 対象の親クラスの初期化を呼び出す(
callBaseMethod関数はMicrosoft AJAX Libraryの中で定義されている関数) - 対象のクラスの破棄を行う
- Extender.vbファイル上のプロパティと連動するプロパティ関数
- コンストラクタやクラスの登録を行う(
registerClass関数はMicrosoft AJAX Libraryの中で定義されている関数)
Type.registerNamespace('[プロジェクト名]');
[プロジェクト名].[クラス名]=function(element) { 初期化設定の記述 }
[プロジェクト名].[クラス名].initializeBase(this, [element]);
[プロジェクト名].[クラス名].prototype = {}
[プロジェクト名].[クラス名].callBaseMethod(this, 'initialize');
[プロジェクト名].[クラス名].callBaseMethod(this, 'dispose');
get_[プロパティ名] : function() {} set_[プロパティ名] : function() {}
[プロジェクト名].[Behaviorファイル名].registerClass('[プロジェクト名].[Behaviorファイル名]',
AjaxControlToolkit.BehaviorBase);
ここに記述した項目はすべてテンプレートが自動生成してくれますが、それぞれどういった意味をもった構文なのか理解をすることが重要です。次の節ではこれらの構文を成り立たせる上で非常に重要なExtenderControlBaseクラスについて説明します。
ExtenderControlBaseクラスとは
ExtenderControlBaseクラスは、ASP.NET AJAXとASP.NET AJAX Control Toolkitの間を繋ぐ抽象クラスです。また、ASP.NET AJAX Control Toolkitのほとんどのクラスの親クラスとして利用されています。ExtenderControlBaseクラスの他にはExtenderControlBaseクラスを継承したAnimationExtenderControlBaseクラスと、AnimationExtenderControlBaseクラスを継承したDynamicPopulateExtenderControlBaseクラスがあります。
- ExtenderControlBaseを継承したクラス(28)
- AccordionExtender
- AlwaysVisibleControlExtender
- AnimationExtenderControlBase
- CalendarExtender
- CascadingDropDown
- CollapsiblePanelExtender
- ConfirmButtonExtender
- DraggableListItemExtender
- DropShadowExtender
- DropWatcherExtender
- DragPanelExtender
- DynamicPopulateExtender
- ExtenderControlBaseDesigner<T>
- FilteredTextBoxExtender
- HoverExtender
- MaskedEditExtender
- MutuallyExclusiveCheckBoxExtender
- NoBotExtender
- NumericUpDownExtender
- PagingBulletedListExtender
- PasswordStrength
- RatingExtender
- ResizableControlExtender
- RoundedCornersExtender
- SliderExtender
- SlideShowExtender
- TextBoxWatermarkExtender
- ToggleButtonExtender
- AnimationExtenderControlBaseを継承したクラス(7)
- AnimationExtender
- AutoCompleteExtender
- DynamicPopulateExtenderControlBase
- ListSearchExtender
- PopupExtender
- UpdatePanelAnimationExtender
- ValidatorCalloutExtender
- DynamicPopulateExtenderControlBaseを継承したクラス(4)
- DropDownExtender
- HoverMenuExtender
- ModalPopupExtender
- PopupControlExtender
ASP.NET AJAXとASP.NET AJAX Control Toolkitを繋ぐための、ExtenderControlBaseクラスの主な機能は次の3つです。
- Extenderコントロール(HTML要素)と振る舞い(JavaScript)の間で接続を行う
- 正しいスクリプトをロードするためScriptManager(ToolkitControlManager)コントロールと対話しながら、管理をする
- 対象のコントロールを制御するための
TargetControlTypeAttribute属性の提供
実際にExtenderControlBaseクラスを継承して利用する場合には、ほとんどの機能は意識せずに利用できますが、いくつかのプロパティとメソッドは利用することがあると思うので以下の表を参考にしてください。
| メソッド名 | 説明 |
| GetPropertyValue(propertyname, nullValue) | Getプロパティ内で利用されるメソッドで、第一引数の値がnull(nothing)ではない場合に値を取得する。第一引数がViewstateのキーとして扱われ、第二引数の値をプロパティウィンドウに表示する値として扱われる。 |
| SetPropertyValue(propertyname, nullValue) | Setプロパティ内で利用されるメソッドで、上記同様にViewStateを利用しているが、プロパティウィンドウで設定した値をJavaScriptファイルと連動し、振る舞い(Behaviors.jsファイル上)の処理に利用することができる。 |
| CheckIfValid(throwException) | プロパティが正しくセットされたかどうか調べるメソッド(引数はBool型で、例外が無効になっている場合に限りTrueを設定)。 |
| EnsureValid() | 派生クラスのプロパティ検証をするためにレンダリングの間呼び出されるメソッド。 |
また、このExtenderControlBaseクラスを継承して利用する時には、AjaxControlToolkit名前空間の属性を利用することになるので以下の属性は最低限押さえておきましょう。
| 属性名 | 説明 |
| ClientScriptResource(componentType, fullResourceName) | ExtenderControlBaseクラスを継承したクラスのインスタンスと、ここに指定されたリソースのスクリプトファイルを結びつける。第一引数のcomponentTypeにJavaScriptファイルのクラス名を、第二引数のfullResourceNameにBehavior.jsファイルのパスを記述する必要あり。 |
| ClientCssResource(fullResourceName) | ExtenderControlBaseクラスを継承したクラスのインスタンスと、ここに指定されたCSSファイルを結びつける。上記同様に、引数fullResourceName にCSSファイルのパスを記述する必要有り |
| ExtenderControlProperty() | この属性が記述されたプロパティはBehavior.jsファイルの同名プロパティと紐付けられる。つまり、クライアントサイドの振る舞いに関係するプロパティすべてに属性として記述する必要あり。 |
| ClientPropertyName(propertyName) | Behavior.jsファイルのスクリプトコード上でExtender.vbファイル上で宣言した名前と異なるプロパティ名を宣言することができる。引数propertyNameにBehavior.jsファイル上で使用したい名前を記述する必要あり。 |
| RequiredScript(extenderType, loadOrder) | 指定されたクラスを読み込んで、そのクラスが組み込んで利用しているスクリプトファイルが利用できる。読み込むクラスの数だけ宣言が可能な属性。第一引数で読み込むクラスの指定を、第二引数は任意だが、もし、Behavior.jsファイルの中で別のBehavior.jsファイルを参照している場合は、参照元のBehavior.jsファイルを記述する必要あり(詳細は後述)。 |
テンプレートを利用してプロジェクトを作成した場合は、テンプレートにより骨組みはほとんどできているので、必要な部分だけ修正や書き加えるだけで利用できます。ExtenderControlBaseクラスに関する説明は以上です。実際開発する前に一度ExtenderControlBase.csクラスや各Attributeクラスも目を通すとExtenderコントロールクラスの作成がもっと楽になるかと思います。

