クライアント動作と Web サーバー コントロールとを関連付けるエクステンダ コントロールの作成

更新 : 2007 年 11 月

充実したユーザー エクスペリエンスを作成するために、ASP.NET の AJAX 機能を使用することで、Web アプリケーションの機能を拡張できます。Web ブラウザの ECMAScript (JavaScript)、DHTML、および AJAX の各機能により、視覚効果や、検証などのクライアント処理を追加できます。

このチュートリアルでは、クライアント動作をカプセル化して Web サーバー コントロールに関連付けるエクステンダ コントロールの作成方法について説明します。このクライアント動作により、ブラウザの DOM (Document Object Model) 要素に機能が追加されます。次に、エクステンダ コントロールが 1 種類以上の ASP.NET サーバー コントロールに関連付けられ、そのサーバー コントロールに動作が追加されます。複数のエクステンダ コントロールを ASP.NET サーバー コントロールに関連付けることができます。

このチュートリアルでは、次の作業を行う方法について説明します。

  • クライアント動作をカプセル化し、ASP.NET Web ページ上の Web サーバー コントロールに追加されるエクステンダ コントロールを作成します。

  • Web サーバー エクステンダ コントロールに関連付けられるクライアント動作を作成します。

  • クライアント動作を使用して、ブラウザ DOM からイベントを処理します。

    Bb386403.alert_note(ja-jp,VS.90).gifメモ :

    個別のエクステンダ コントロールがなくても、ASP.NET サーバー コントロールに充実したクライアント機能を追加できます。このチュートリアルに示すクライアント機能と同じ機能を含む Web サーバー コントロールを作成する方法の例については、「Web サーバー コントロールへのクライアント機能の追加」を参照してください。

  • カスタム エクステンダ コントロールをコンパイルしてアセンブリを生成し、同じアセンブリ内のリソースとして関連付けられた JavaScript ファイルを埋め込みます。

  • ASP.NET AJAX 対応の Web ページで、コンパイルしたカスタム エクステンダ コントロールを参照します。

クライアント要件の識別

このチュートリアルでは、ブラウザでコントロールが選択された (つまりフォーカスを得た) ときに、Web ページ内のコントロール (TextBox コントロール、Button コントロールなど) を強調表示する単純なクライアント動作を実装します。たとえば、コントロールがフォーカスを得たときに背景色を変更し、フォーカスが別のコントロールに移動したときに既定の色に戻すことができます。

この動作を実装するには、このチュートリアルのクライアント コントロールが次の表に示す機能を備えている必要があります。

必要な機能

実装

DOM 要素を強調表示する方法。

ASP.NET Web ページ内の DOM 要素を強調表示するために、クライアント コントロールは、クラス名により識別されるカスケード スタイル シート (CSS: Cascading Style Sheet) スタイルを適用します。このスタイルはユーザーが構成できます。

DOM 要素を強調表示されていない状態に戻す方法。

ASP.NET ページ内の DOM 要素から強調表示を削除するために、クライアント コントロールは、クラス名により識別される CSS スタイルを適用します。このスタイルはユーザーが構成でき、既定のスタイルとして DOM 要素に適用されます。

DOM 要素がいつ選択されたかを識別する方法。

DOM 要素がいつ選択されたか (フォーカスを得たか) を識別するために、コントロールは DOM 要素の onfocus イベントを処理します。

DOM 要素がいつ選択解除されたかを識別する方法。

コントロールがいつ選択解除されたかを識別するために、コントロールは DOM 要素の onblur イベントを処理します。

エクステンダ コントロールの作成

ASP.NET ページ開発者が使用するクライアント動作をカプセル化するために、エクステンダ コントロールを使用できます。エクステンダ コントロールは、System.Web.UI 名前空間内の ExtenderControl 抽象クラスを継承する Web サーバー コントロールです。特定の種類の Web サーバー コントロールにエクステンダ コントロールを適用できます。TargetControlTypeAttribute 属性を使用して、エクステンダ コントロールを適用できる Web サーバー コントロールの種類を識別します。

このチュートリアルのエクステンダ コントロールは、すべての種類の Web サーバー コントロールに適用できます。クラス定義の例を次に示します。

<TargetControlType(GetType(Control))> _
Public Class FocusExtender
    Inherits ExtenderControl
[TargetControlType(typeof(Control))]
public class FocusExtender : ExtenderControl

新しいエクステンダ コントロールには、クライアント要件の実装に使用される 2 つのプロパティがあります。

  • HighlightCssClass は、DOM 要素に適用される CSS クラスを識別し、コントロールがフォーカスを得たときに強調表示します。

  • NoHighlightCssClass は、フォーカスがないときに DOM 要素に適用される CSS クラスを識別します。

ExtenderControl 抽象クラスの継承

エクステンダ コントロールで実装する必要がある ExtenderControl 抽象クラスのメンバを次の表に示します。

メンバ

説明

GetScriptDescriptors

ECMAScript (JavaScript) クライアント コンポーネントを表す ScriptDescriptor オブジェクトのコレクションを返します。これには、作成するクライアントの種類、割り当てるプロパティ、およびハンドラが追加されるイベントが含まれます。

GetScriptReferences

コントロールに含めるクライアント スクリプト ライブラリに関する情報を含む ScriptReference オブジェクトのコレクションを返します。クライアント スクリプト ライブラリはクライアントの種類を定義し、コントロールに必要なその他の JavaScript コードを格納します。

このチュートリアルのエクステンダ コントロールは、GetScriptDescriptors() メソッドを使用してクライアント動作の種類のインスタンスを定義します。コントロールは新しい ScriptBehaviorDescriptor オブジェクト (ScriptBehaviorDescriptor クラスは ScriptDescriptor クラスから派生します) を作成し、そのオブジェクトを GetScriptDescriptors メソッドの戻り値に格納します。

ScriptBehaviorDescriptor オブジェクトは、クライアント クラス (Samples.FocusBehavior) の名前、および関連付けられた (対象の) Web サーバー コントロールの ClientID 値を格納します。クライアント クラス名と ClientID プロパティ値は、ScriptBehaviorDescriptor オブジェクトのコンストラクタに渡されます。対象の Web サーバー コントロールへの参照は、GetScriptDescriptors(Control) メソッドへのパラメータとして指定されます。参照を使用すると、対象の Web サーバー コントロールの ClientID 値を確認できます。これは、描画される DOM 要素の id 値です。

ScriptBehaviorDescriptor クラスは、クライアント動作のプロパティ値の設定に使用されます。このプロパティ値は、サーバー上のエクステンダ コントロールのプロパティから取得されます。クライアント動作のプロパティを定義するために、エクステンダ コントロールは ScriptBehaviorDescriptor クラスの AddProperty メソッドを使用します。次に、エクステンダ コントロールは、サーバー エクステンダ コントロールの対応するプロパティに基づいて、クライアント動作のプロパティの名前と値を指定します。この例では ScriptBehaviorDescriptor オブジェクトを使用して、クライアント動作の highlightCssClass プロパティと nohighlightCssClass プロパティの値を設定します。

エクステンダ コントロールは、GetScriptDescriptors メソッドの戻り値で ScriptBehaviorDescriptor オブジェクトを渡します。したがって、Web サーバー コントロールがブラウザに表示されると、ASP.NET は、定義済みのすべてのプロパティとイベント ハンドラを使用してクライアント動作のインスタンスを作成する JavaScript を描画します。動作インスタンスは、対象の Web サーバー コントロールから表示される ClientID プロパティに基づいて DOM 要素にアタッチされます。ページ内のこのチュートリアルから ASP.NET サーバー コントロールとエクステンダ コントロールを追加する、宣言の ASP.NET マークアップの例を次に示します。

<asp:TextBox ID="TextBox1" runat="server" />
<sample: FocusExtender runat="server"
    ID="FocusExtender1" 
    HighlightCssClass="MyHighLight"
    NoHighlightCssClass="MyLowLight"
    TargetControlID="TextBox1" />

ページのレンダリングされた出力には、作成するクライアント動作を識別する $create メソッドの呼び出しが含まれます。クライアント動作のプロパティの値、およびクライアント動作の対象となる DOM 要素の id 値も指定されます。レンダリングされた $create メソッドの例を次に示します。

$create(Samples.FocusBehavior, {"highlightCssClass":"MyHighLight","nohighlightCssClass":"MyLowLight"}, null, null, $get('TextBox1'));

このチュートリアルのエクステンダ コントロールは、GetScriptReferences メソッドを使用してクライアント動作の種類を定義するスクリプト ライブラリの場所を渡します。この例では、これは FocusBehavior.js という名前のスクリプト ファイルへの URL です。このファイルは、チュートリアルの後半で作成します。新しい ScriptReference オブジェクトを作成した後、Path プロパティをクライアント コードを含むファイルの URL に設定することで、参照が行われます。

GetScriptDescriptors メソッドおよび GetScriptReferences メソッドの実装を次に示します。

Protected Overrides Function GetScriptReferences() As IEnumerable(Of ScriptReference)
    Dim reference As ScriptReference = New ScriptReference()
    reference.Path = ResolveClientUrl("FocusBehavior.js")

    Return New ScriptReference() {reference}
End Function

Protected Overrides Function GetScriptDescriptors(ByVal targetControl As Control) As IEnumerable(Of ScriptDescriptor)
    Dim descriptor As ScriptBehaviorDescriptor = New ScriptBehaviorDescriptor("Samples.FocusBehavior", targetControl.ClientID)
    descriptor.AddProperty("highlightCssClass", Me.HighlightCssClass)
    descriptor.AddProperty("nohighlightCssClass", Me.NoHighlightCssClass)

    Return New ScriptDescriptor() {descriptor}
End Function
protected override IEnumerable<ScriptReference> GetScriptReferences()
{
    ScriptReference reference = new ScriptReference();
    reference.Path = ResolveClientUrl("FocusBehavior.js");

    return new ScriptReference[] { reference };
}

protected override IEnumerable<ScriptDescriptor> GetScriptDescriptors(Control targetControl)
{
    ScriptBehaviorDescriptor descriptor = new ScriptBehaviorDescriptor("Samples.FocusBehavior", targetControl.ClientID);
    descriptor.AddProperty("highlightCssClass", this.HighlightCssClass);
    descriptor.AddProperty("nohighlightCssClass", this.NoHighlightCssClass);

    return new ScriptDescriptor[] { descriptor };
}

クライアント動作の作成

エクステンダ コントロールでは、GetScriptReferences メソッドは、動作の種類のクライアント コードを含む JavaScript ファイル (FocusBehavior.js) を指定します。ここでは、そのファイル内の JavaScript コードについて説明します。

クライアント動作コードは、GetScriptDescriptors メソッドが返す ScriptDescriptor オブジェクトに指定されたメンバと一致します。クライアント動作には、サーバー エクステンダ コントロール内のメンバに対応しないメンバを指定することもできます。

このチュートリアルのエクステンダ コントロールは、クライアント動作の名前を Samples.FocusBehavior に設定し、クライアント動作の highlightCssClass と nohighlightCssClass の 2 つのプロパティを定義します。

クライアント コンポーネントと動作を作成する方法の詳細については、「プロトタイプ モデルを使用したクライアント コンポーネント クラスの作成」を参照してください。

クライアント名前空間の作成

クライアント コードは、まず Type クラスの registerNamespace メソッドを呼び出して、独自の名前空間 (Samples) を作成する必要があります。クライアント名前空間を登録する方法の例を次に示します。

// Register the namespace for the control.
Type.registerNamespace('Samples');

クライアント クラスの定義

Samples.FocusBehavior クラスは、Samples.FocusBehavior クライアント クラスを定義します。このクラスには、Web サーバー コントロールによって指定されたプロパティ値を保持する 2 つのプロパティが含まれます。

クラス プロトタイプの定義

Samples.FocusBehavior クラスを定義した後、コードはクラスのプロトタイプを定義します。プロトタイプには、プロパティの get アクセサと set アクセサ、および DOM 要素の onfocus イベントと onblur イベントのイベント ハンドラが含まれます。また、動作のインスタンスが作成されたときに呼び出される initialize メソッド、およびページで動作が不要になったときにクリーンアップを実行する dispose メソッドも含まれます。

DOM 要素のイベント ハンドラの定義

クライアント クラスのイベント ハンドラは、クラス プロトタイプのメソッドとして定義されます。addHandlers メソッドを使用することで、ハンドラはイベント デリゲートおよびブラウザ DOM のイベントに関連付けられます。このメソッドについては、initialize メソッドと共にこのトピックの後半で説明します。

プロパティの get メソッドと set メソッドの定義

エクステンダ コントロールの GetScriptDescriptors メソッドの ScriptDescriptor オブジェクトで指定される各プロパティには、対応するクライアント アクセサが必要です。クライアント プロパティ アクセサは、クライアント クラス プロトタイプの get_<property name> メソッドおよび set_<property name> メソッドとして定義されます。

initialize メソッドと dispose メソッドの実装

initialize メソッドは、動作のインスタンスが作成されたときに呼び出されます。このメソッドを使用して、既定のプロパティ値の設定、関数デリゲートの作成、およびイベント ハンドラとしてのデリゲートの追加を行います。

Samples.FocusBehavior クラスの initialize メソッドは、次の処理を行います。

  • Sys.UI.Behavior 基本クラスの initialize メソッドを呼び出します。

  • addHandlers メソッドを呼び出して、関連付けられた DOM 要素の onfocus イベントと onblur イベントのハンドラとしてイベント デリゲートを追加します。イベント名の "on" 部分 (onfocus など) は指定しません。

dispose メソッドは、ページ上で動作のインスタンスが使用されなくなり、削除されたときに呼び出されます。このメソッドを使用して、DOM イベント ハンドラなど、動作で不要になったリソースを解放します。

Sample.FocusBehavior クラスの dispose メソッドは、次の処理を行います。

  • clearHandlers メソッドを呼び出して、関連付けられた DOM 要素の onfocus イベントと onblur イベントのハンドラとしてのイベント デリゲートを消去します。

  • Behavior 基本クラスの dispose メソッドを呼び出します。

    Bb386403.alert_note(ja-jp,VS.90).gifメモ :

    クライアント クラスの dispose メソッドは、複数回呼び出すことができます。dispose メソッドに含めるコードでこのことが考慮されていることを確認します。

動作の登録

クライアント動作を作成する最後のタスクでは、registerClass メソッドを呼び出してクライアント クラスを登録します。クラスはクライアント動作であるため、registerClass メソッドの呼び出しには、登録する JavaScript クラス名が含まれます。また、Behavior を基本クラスとして指定します。

以下に示す完全な例には、Sys.Application クラスの notifyScriptLoaded メソッドの呼び出しも含まれています。この呼び出しは、JavaScript ファイルが読み込まれたことを Microsoft AJAX Library に通知するために必要です。

Samples.FocusBehavior クライアント動作の完全な JavaScript コード例を次に示します。このチュートリアルのコードを実行するには、JavaScript ファイルに FocusBehavior.js という名前を付けて、Scripts ディレクトリに配置する必要があります。

// Register the namespace for the control.
Type.registerNamespace('Samples');

//
// Define the behavior properties.
//
Samples.FocusBehavior = function(element) { 
    Samples.FocusBehavior.initializeBase(this, [element]);

    this._highlightCssClass = null;
    this._nohighlightCssClass = null;
}

//
// Create the prototype for the behavior.
//

Samples.FocusBehavior.prototype = {


    initialize : function() {
        Samples.FocusBehavior.callBaseMethod(this, 'initialize');

        $addHandlers(this.get_element(), 
                     { 'focus' : this._onFocus,
                       'blur' : this._onBlur },
                     this);

        this.get_element().className = this._nohighlightCssClass;
    },

    dispose : function() {
        $clearHandlers(this.get_element());

        Samples.FocusBehavior.callBaseMethod(this, 'dispose');
    },

    //
    // Event delegates
    //

    _onFocus : function(e) {
        if (this.get_element() && !this.get_element().disabled) {
            this.get_element().className = this._highlightCssClass;          
        }
    },

    _onBlur : function(e) {
        if (this.get_element() && !this.get_element().disabled) {
            this.get_element().className = this._nohighlightCssClass;          
        }
    },


    //
    // Behavior properties
    //

    get_highlightCssClass : function() {
        return this._highlightCssClass;
    },

    set_highlightCssClass : function(value) {
        if (this._highlightCssClass !== value) {
            this._highlightCssClass = value;
            this.raisePropertyChanged('highlightCssClass');
        }
    },

    get_nohighlightCssClass : function() {
        return this._nohighlightCssClass;
    },

    set_nohighlightCssClass : function(value) {
        if (this._nohighlightCssClass !== value) {
            this._nohighlightCssClass = value;
            this.raisePropertyChanged('nohighlightCssClass');
        }
    }
}

// Optional descriptor for JSON serialization.
Samples.FocusBehavior.descriptor = {
    properties: [   {name: 'highlightCssClass', type: String},
                    {name: 'nohighlightCssClass', type: String} ]
}

// Register the class as a type that inherits from Sys.UI.Control.
Samples.FocusBehavior.registerClass('Samples.FocusBehavior', Sys.UI.Behavior);

if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();

ASP.NET ページの完全なコード例を次に示します。

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>ASP.NET AJAX Behavior Sample</title>
    <style type="text/css">
    .LowLight
    {
        background-color:#EEEEEE;
    }

    .HighLight
    {
        background-color:#FFFFF0;
    }
    .LowLightButton
    {
        font-weight:normal;
        width:100px;
    }

    .HighLightButton
    {
        font-weight:bold;
        width:100px;
    }
    </style>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server" />
        <div>
            <table border="0" cellpadding="2">
              <tr>
                <td><asp:Label runat="server" ID="Label1" AssociatedControlID="TextBox1">Name</asp:Label></td>
                <td><asp:TextBox ID="TextBox1" runat="server" /></td>
              </tr>
              <tr>
                <td><asp:Label runat="server" ID="Label2" AssociatedControlID="TextBox2">Phone</asp:Label></td>
                <td><asp:TextBox ID="TextBox2" runat="server" /></td>
              </tr>
              <tr>
                <td><asp:Label runat="server" ID="Label3" AssociatedControlID="TextBox3">E-mail</asp:Label></td>
                <td><asp:TextBox ID="TextBox3" runat="server" /></td>
              </tr>
            </table>

            <asp:Button runat="server" ID="Button1" Text="Submit Form" />

            <sample:FocusExtender ID="FocusExtender1" runat="server"
                                  NoHighlightCssClass="LowLight"
                                  HighlightCssClass="HighLight"
                                  TargetControlID="TextBox1" />
            <sample:FocusExtender ID="FocusExtender2" runat="server"
                                  NoHighlightCssClass="LowLight"
                                  HighlightCssClass="HighLight"
                                  TargetControlID="TextBox2" />
            <sample:FocusExtender ID="FocusExtender3" runat="server"
                                  NoHighlightCssClass="LowLight"
                                  HighlightCssClass="HighLight"
                                  TargetControlID="TextBox3" />
            <sample:FocusExtender ID="FocusExtender4" runat="server"
                                  NoHighlightCssClass="LowLightButton"
                                  HighlightCssClass="HighLightButton"
                                  TargetControlID="Button1" />
        </div>

    </form>
</body>
</html>

FocusExtender クラスの完全なコード例を次に示します。通常、このコードは App_Code ディレクトリに配置します。

Imports System
Imports System.Data
Imports System.Configuration
Imports System.Web
Imports System.Web.Security
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.WebControls.WebParts
Imports System.Web.UI.HtmlControls
Imports System.Collections.Generic

Namespace Samples.VB

    <TargetControlType(GetType(Control))> _
    Public Class FocusExtender
        Inherits ExtenderControl

        Private _highlightCssClass As String
        Private _noHighlightCssClass As String

        Public Property HighlightCssClass() As String
            Get
                Return _highlightCssClass
            End Get
            Set(ByVal value As String)
                _highlightCssClass = value
            End Set
        End Property

        Public Property NoHighlightCssClass() As String
            Get
                Return _noHighlightCssClass
            End Get
            Set(ByVal value As String)
                _noHighlightCssClass = value
            End Set
        End Property

        Protected Overrides Function GetScriptReferences() As IEnumerable(Of ScriptReference)
            Dim reference As ScriptReference = New ScriptReference()
            reference.Path = ResolveClientUrl("FocusBehavior.js")

            Return New ScriptReference() {reference}
        End Function

        Protected Overrides Function GetScriptDescriptors(ByVal targetControl As Control) As IEnumerable(Of ScriptDescriptor)
            Dim descriptor As ScriptBehaviorDescriptor = New ScriptBehaviorDescriptor("Samples.FocusBehavior", targetControl.ClientID)
            descriptor.AddProperty("highlightCssClass", Me.HighlightCssClass)
            descriptor.AddProperty("nohighlightCssClass", Me.NoHighlightCssClass)

            Return New ScriptDescriptor() {descriptor}
        End Function
    End Class
End Namespace
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Generic;

namespace Samples.CS
{
    [TargetControlType(typeof(Control))]
    public class FocusExtender : ExtenderControl
    {
        private string _highlightCssClass;
        private string _noHighlightCssClass;

        public string HighlightCssClass
        {
            get { return _highlightCssClass; }
            set { _highlightCssClass = value; }
        }

        public string NoHighlightCssClass
        {
            get { return _noHighlightCssClass; }
            set { _noHighlightCssClass = value; }
        }

        protected override IEnumerable<ScriptReference> GetScriptReferences()
        {
            ScriptReference reference = new ScriptReference();
            reference.Path = ResolveClientUrl("FocusBehavior.js");

            return new ScriptReference[] { reference };
        }

        protected override IEnumerable<ScriptDescriptor> GetScriptDescriptors(Control targetControl)
        {
            ScriptBehaviorDescriptor descriptor = new ScriptBehaviorDescriptor("Samples.FocusBehavior", targetControl.ClientID);
            descriptor.AddProperty("highlightCssClass", this.HighlightCssClass);
            descriptor.AddProperty("nohighlightCssClass", this.NoHighlightCssClass);

            return new ScriptDescriptor[] { descriptor };
        }
    }
}

テスト用のエクステンダ コントロールの動的コンパイル

このチュートリアルのエクステンダ コントロールなど、すべての Web サーバー コントロールは、Web ページで参照する前にコンパイルする必要があります。ASP.NET Version 2.0 の動的コンパイル機能を使用して、Web サーバー コントロールを手動でコンパイルしてアセンブリを生成することなくコントロールをテストできます。これにより、Web サーバー コントロール コードを最初に作成してデバッグするときに時間を短縮できます。次の手順では、App_Code フォルダを使用してエクステンダ コントロールを動的にコンパイルする方法を示します。

動的にコンパイルするためにエクステンダ コントロールを App_Code フォルダに配置するには

  1. Web サイトのルート フォルダに App_Code フォルダを作成します。

  2. .cs または .vb コントロール ソース ファイルと関連するクラスを App_Code フォルダに移動します。

    または

    以前にこのコントロールのアセンブリを Bin フォルダに追加している場合は、そのアセンブリを削除します。App_Code フォルダ内のソース ファイルの編集を続行します。プロジェクトを実行するたびに、コントロール ソース コードがコンパイルされます。

    Bb386403.alert_note(ja-jp,VS.90).gifメモ :

    コントロールをコンパイルして生成したアセンブリを Bin フォルダに格納するか、コントロールのソース ファイルを App_Code フォルダに格納できますが、両方を行うことはできません。両方のフォルダにコントロールを追加すると、ページ パーサーはページのコントロールへの参照を解決できないためにエラーを生成します。

  3. Web ページを実行します。エクステンダ コントロールが動的にコンパイルされます。

Web ページでの動的にコンパイルされたエクステンダ コントロールのテスト

次の手順では、ASP.NET AJAX 対応の Web ページでエクステンダ コントロールをテストする方法について説明します。Web サーバー コントロールのコードは、App_Code フォルダから動的にコンパイルされます。

ASP.NET ページ内で動作を使用するには

  1. 新しい ASP.NET Web ページを作成します。

  2. ページに ScriptManager コントロールがない場合は追加します。

  3. 強調表示されたテキスト ボックスと強調表示されていないテキスト ボックスの CSS スタイル規則を作成します。

    コントロールは、任意の方法で強調表示できます。たとえば、コントロールの背景色の変更、境界線の追加、テキストのフォントの変更などの方法があります。

  4. @ Register ディレクティブをページに追加し、エクステンダ コントロールの名前空間と TagPrefix 属性を指定します。

    Bb386403.alert_note(ja-jp,VS.90).gifメモ :

    この例では、サーバー コントロール コードは動的にコンパイルできるように App_Code フォルダにあります。したがって、アセンブリ属性は指定しません。

  5. TextBox コントロールと Button コントロールをページに追加し、Id プロパティを設定します。

    コントロールのマークアップには runat="server" を含める必要があります。

  6. FocusExtender コントロールのインスタンスをページに追加します。

  7. FocusExtender コントロールの TargetControlID プロパティを、前の手順で追加した Button コントロールの ID に設定します。

  8. HighlightCssClass プロパティを強調表示の CSS スタイルに設定し、NoHighlightCssClass プロパティを強調表示なしの CSS スタイルに設定します。

  9. ページを実行し、各コントロールを選択します。

    Button コントロールを選択すると、強調表示されます。

  10. FocusExtender コントロールの TargetControlID プロパティを TextBox コントロールの ID に変更した後、ページを再度実行します。

    今度は、TextBox コントロールがフォーカスを得たときに強調表示されます。FocusExtender コントロールにカプセル化された動作は、ページ上の別の ASP.NET サーバー コントロールに適用できます。動作を複数のコントロールに適用するには、エクステンダ コントロールの複数のインスタンスをページに追加し、各インスタンスを別の ASP.NET サーバー コントロールに関連付けます。

エクステンダ コントロールのアセンブリへのコンパイル

JavaScript コンポーネントと Web サーバー コントロールの拡張コードをアセンブリに埋め込むと、カスタム エクステンダ コントロールを簡単に配置できるようになります。アセンブリの作成により、コントロールのバージョン管理も簡単になります。また、コンパイルしてアセンブリを生成しなければ、コントロールをデザイナのツールボックスに追加することはできません。

次の手順では、Visual Studio を使用して既存のチュートリアル プロジェクトで新しいコード ライブラリを作成する方法について説明します。コード ファイルのコピーを、このチュートリアルのプロジェクト内の新しいコード ライブラリに移動します。コード ライブラリでエクステンダ コントロールをコンパイルすると、ユーザーが配置できるアセンブリが作成されます。

Bb386403.alert_note(ja-jp,VS.90).gifメモ :

この手順を実行するには、Microsoft Visual Studio 2005 または Visual Studio 2008 を使用する必要があります。Microsoft Visual Web Developer Express Edition は使用できません。これは、Visual Web Developer Express Edition を使用すると同じソリューション内に 2 つのプロジェクトを作成できないためです。

既存のプロジェクトに新しいコード ライブラリを追加するには

  1. Visual Studio で、[ファイル] メニューの [新規作成] をクリックし、[プロジェクト] をクリックします。

    [新しいプロジェクト] ダイアログ ボックスが表示されます。

  2. [プロジェクトの種類] で、[Visual C#] または [Visual Basic] を選択します。

  3. [テンプレート] で、[クラス ライブラリ] を選択し、プロジェクトに Samples という名前を付けます。

  4. [ソリューション] の一覧で、[ソリューションに追加] を選択し、[OK] をクリックします。

    既存のソリューションに Samples クラス ライブラリが追加されます。

カスタム サーバー エクステンダ コントロールをコード ライブラリに移動するには

  1. 次の参照を Samples クラス ライブラリ プロジェクトに追加します。この参照は、カスタム サーバー エクステンダ コントロールで必要です。

    • System.Drawing

    • System.Web

    • System.Web.Extensions

  2. ソリューション エクスプローラで、元のチュートリアル プロジェクトから Samples クラス ライブラリ プロジェクトのルートに FocusExtender.cs ファイルまたは FocusExtender.vb ファイルと、FocusBehavior.js ファイルをコピーします。

  3. FocusBehavior.js ファイルの [プロパティ] ウィンドウで、[ビルド アクション][埋め込まれたリソース] に設定します。

    スクリプト ファイルを埋め込みリソースに設定

  4. 次のプロパティを AssemblyInfo ファイルに追加します。

    <Assembly: System.Web.UI.WebResource("Samples.FocusBehavior.js", "text/javascript")> 
    
    [assembly: System.Web.UI.WebResource("Samples.FocusBehavior.js", "text/javascript")]
    
    Bb386403.alert_note(ja-jp,VS.90).gifメモ :

    AssemblyInfo.vb ファイルは、ソリューション エクスプローラの [My Project] ノードにあります。[My Project] ノードにファイルが表示されない場合は、[プロジェクト] メニューの [すべてのファイルを表示] をクリックします。AssemblyInfo.cs ファイルは、ソリューション エクスプローラの [プロパティ] ノードにあります。

    JavaScript ファイルの WebResource 定義は、[assembly namespace].[JavaScript File name].js の名前付け規則に従う必要があります。

    Bb386403.alert_note(ja-jp,VS.90).gifメモ :

    既定では、Visual Studio はアセンブリ名前空間をアセンブリ名に設定します。アセンブリのプロパティでアセンブリ名前空間を編集できます。

  5. FocusExtender クラス ファイルで、GetScriptReferences メソッド内の ScriptReference オブジェクトを変更して、Samples アセンブリに埋め込まれたクライアント コントロール スクリプトを参照するようにします。このためには、次の変更を行います。

    • Path プロパティを、"Samples" に設定された Assembly で置き換えます。

    • Name プロパティを追加し、値を "Samples.FocusBehavior.js" に設定します。

    この変更の結果の例を次に示します。

            Protected Overrides Function GetScriptReferences() As IEnumerable(Of ScriptReference)
                Dim reference As ScriptReference = New ScriptReference()
                reference.Assembly = "Samples"
                reference.Name = "Samples.FocusBehavior.js"
    
                Return New ScriptReference() {reference}
            End Function
    
         protected override IEnumerable<ScriptReference> GetScriptReferences()
            {
                ScriptReference reference = new ScriptReference();
                reference.Assembly = "Samples";
                reference.Name = "Samples.FocusBehavior.js";
    
                return new ScriptReference[] { reference };
            }
    
  6. プロジェクトをビルドします。

    コンパイルが完了すると、Samples.dll という名前のアセンブリが生成されます。JavaScript コード ファイル (FocusBehavior.js) は、このアセンブリにリソースとして埋め込まれます。

    Bb386403.alert_note(ja-jp,VS.90).gifメモ :

    新しいソース ファイルの追加、または既存のソース ファイルの変更の場合は、必ずクラス ライブラリ プロジェクトを再度ビルドしてください。

Web ページ内のアセンブリからのコンパイルされたエクステンダ コントロールの使用

ここで、ASP.NET AJAX 対応の Web ページで、コンパイルしたカスタム エクステンダ コントロールを参照します。

ASP.NET AJAX 対応の Web ページで、コンパイルしたカスタム エクステンダ コントロールを参照するには

  1. 新しい ASP.NET AJAX プロジェクトを作成します。

  2. Web サイトのルート ディレクトリに Bin フォルダを作成します。

  3. Samples クラス プロジェクトの Bin\Debug フォルダまたは Bin\Release フォルダから新しい Bin フォルダに Samples.dll アセンブリをコピーします。

  4. TestFocusExtender.aspx という名前の新しい ASP.NET Web ページを追加した後、次のマークアップを新しいページに追加します。

    <%@ Register Assembly="Samples" Namespace="Samples.VB" TagPrefix="sample" %>
    
    <%@ Register Assembly="Samples" Namespace="Samples.CS" TagPrefix="sample" %>
    

    サーバー コントロールはアセンブリにコンパイルされるため、@ Register ディレクティブには、Namespace 属性と TagPrefix 属性の他に、Samples アセンブリを参照する Assembly 属性が含まれています。

  5. ページを実行し、各コントロールを選択します。

    FocusBehavior コントロールを選択すると、強調表示されます。

コンパイルされたカスタム エクステンダ コントロールを使用する Web ページには、@ Register ディレクティブの Assembly 属性が含まれます。それ以外の場合、この Web ページは App_Code フォルダ内のコントロールに使用した Web ページと同じです。

参照

概念

Web サーバー コントロールへのクライアント機能の追加

ASP.NET UpdatePanel コントロールとデータ バインド コントロールの使用

参照

Sys.UI.Behavior Class CTP

ExtenderControl

ScriptManager