次の方法で共有


単純 ASP.NET サーバー コントロールの開発

このトピックでは、1 つのプロパティを持ち、イベントを発生させたり処理したりしない単純カスタム サーバー コントロールを作成する手順を示します。

単純 ASP.NET サーバー コントロールを作成するには

  1. System.Web.UI.Control から直接または間接的にクラスを派生させて定義します。

    using System;
    using System.Web.UI;
    public class FirstControl : Control{...}
    [Visual Basic]
    Imports System
    Imports System.Web.UI
    Public Class FirstControl   Inherits Control
    End Class
    

    using ディレクティブを使用すると、完全限定名を使用せずに、名前空間から型を参照できます。したがって、ControlSystem.Web.UI.Control. として解決されます。

  2. 定義したコントロールを名前空間に格納します。新しい名前空間を定義するか、または既存の名前空間を使用できます。名前空間の名前は、Register ページ ディレクティブの名前空間擬似属性の値です。たとえば、<%@ Register TagPrefix="Custom" Namespace="CustomControls" Assembly = "CustomControls" %> のように記述します。ASP.NET ページでカスタム コントロールを使用する例については、このトピックの末尾の例を参照してください。

    namespace CustomControls
    {
          public class FirstControl : Control {...}
    ...
    }
    [Visual Basic]
    Namespace CustomControls
       Public Class FirstControl
          Inherits Control
          ...
       End Class
    End Namespace
    
  3. コントロールに必要なプロパティを定義します。Message という名前のプロパティを定義するコードを次に示します。プロパティは、スマート フィールドに似ており、アクセサ メソッドを持っています。

    private String message = "Hello";
    //The Message property.
          public virtual String Message{
                get{
                      return message;
                }
                set{
                      message = value;
                }
          }
    [Visual Basic]
    Private _message As String = "Hello"
    Public Overridable Property Message() As String
       Get
          Return _message
       End Get
       Set
          _message = value
       End Set
    End Property
    

    プロパティの詳細については、「プロパティの概要」を参照してください。ラウンド トリップの間に状態を維持するプロパティを定義する場合は、「コントロールの状態の維持」を参照してください。

  4. 定義したコントロールが Control から継承する Render メソッドをオーバーライドします。このメソッドは、クライアント ブラウザに HTML を送信するためのロジックを提供します。コントロールがクライアントに送信する HTML は、次の例で示すように、System.Web.UI.HtmlTextWriter のインスタンスの Write メソッドに文字列引数として渡されます。

    protected override void Render( HtmlTextWriter writer)
                {
                writer.Write("<font> "+ this.Message + "<br>" +
                            "The date and time on the server: " +      
                             System.DateTime.Now.ToLongTimeString()
                             + "</font>");
                }
    [Visual Basic]
    Protected Overrides Sub Render(writer As HtmlTextWriter)
       writer.Write(("<font> " & Me.Message & "<br>" & _
          "The time on the server is " & _
          System.DateTime.Now.ToLongTimeString() & _
          "</font>"))
    End Sub
    

    このコードでアクセスする System.DateTime クラスは、日付と時刻の情報を提供するユーティリティ クラスです。このクラスは、サーバー上で呼び出されるため、サーバー上の時刻を返します。

    このコードでは、HTML がそのまま HtmlTextWriterWrite メソッドに文字列引数として渡されています。HtmlTextWriter のメソッドを使用して HTML の表示を単純化する方法、および WebControl から派生させたコントロールを表示する方法については、「ASP.NET サーバー コントロールのレンダリング」を参照してください。

    この例では、わかりやすくするために、Control から FirstControl を派生させています。独自の表示を実行するコントロールを作成する場合は、コントロールが UI 固有のプロパティを継承できるように、System.Web.UI.WebControls.WebControl から派生させてください。

  5. 実行時属性とデザイン時属性を追加して、必要に応じてコントロールにカスタム メタデータを提供します。実行時属性が必須であるコントロールもあります。実行時属性を必要とするコントロールには、テンプレートを公開するコントロール、データ連結を実行するコントロール、カスタム解析ロジックが必要なコントロールなどがあります。実行時属性の例については、「テンプレート コントロールの開発」を参照してください。コントロールを Visual Studio .NET などのビジュアル デザイナで使用する場合は、デザイン時属性が必要です。デザイン時属性は、共通言語ランタイムには必要ありませんが、デザイン時にコントロールを表示するために必要なメタデータを提供します。手順 2. で定義した Message プロパティにデザイン時属性を適用するコードを次に示します。

    [Description("A message string to display to the user")]
    public virtual String Message{...}
    [Visual Basic]
    <Description("A message string to display to the user")> _
    Public Overridable Property Message() As String
       ...
    End Property
    

    デザイン時属性の詳細については、「コンポーネントのデザイン時属性」および「属性とデザイン時サポート」を参照してください。

  6. 作成したコントロールを保存、コンパイル、および配置するには、次の手順を実行します。

    1. アプリケーションのルート ディレクトリに、/bin という名前のサブディレクトリを作成します。
    2. ソース ファイルをアセンブリ (.dll) としてコンパイルし、アセンブリをアプリケーションの /bin サブディレクトリに保存します。

    たとえば、C# で記述したソース コードを FirstControl.cs という名前のファイルに保存している場合は、ソース ファイルが格納されているディレクトリで次のコマンドを実行できます。

    csc /t[arget]:library /out:[path to bin]bin\CustomControls.dll /r[eference]:System.Web.dll /r:System.dll FirstControl.cs
    

    /r オプションは、コントロールがどのアセンブリを参照するかをコンパイラに指示します。

    コントロールがコンパイルされ、アプリケーションのルート ディレクトリ (またはそのサブディレクトリのいずれか) にある任意の ASP.NET ページから使用できるようになります。

FirstControl の完全なコードは、次のとおりです。このコントロールは、CustomControls 名前空間に格納されています。

using System;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace CustomControls
{
      public class FirstControl : Control
      {
            private String message = "Hello";
            
            public virtual String Message
            {
                  get
                  {
                        return message;
                  }
                  set
                  {
                        message = value;
                  }
            }
            
            protected override void Render( HtmlTextWriter writer)
            {
            writer.Write("<font> "
                        + this.Message + "<br>" + "The time on the server is " + System.DateTime.Now.ToLongTimeString()
                        + "</font>");
                  
            }
      
      }
}
[Visual Basic]
Option Explicit
Option Strict

Imports System
Imports System.Web.UI
Imports System.Web.UI.WebControls

Namespace CustomControls
   Public Class FirstControl
      Inherits Control
      Private _message As String = "Hello"
      
      Public Overridable Property Message() As String
         Get
            Return _message
         End Get
         Set
            _message = value
         End Set
      End Property
      
      Protected Overrides Sub Render(writer As HtmlTextWriter)
         writer.Write(("<font> " + Me.Message + "<br>" + "The time on the server is " + System.DateTime.Now.ToLongTimeString() + "</font>"))
      End Sub
   End Class
End Namespace

ASP.NET ページでの FirstControl の使用

上の例で作成したカスタム コントロールを使用する ASP.NET ページを次に示します。Register ページ ディレクティブを使用すると、ページ開発者は名前空間のエイリアスを作成できます。また、このページ ディレクティブは、そのコントロールを含めるアセンブリの名前を ASP.NET に提供します。CustomControls 名前空間に対してエイリアス Custom を作成する例を次に示します。

<%@ Register TagPrefix="Custom" Namespace="CustomControls" Assembly = "CustomControls" %>
<html>
   <body>   
      <form  runat=server>          
          Here is a custom ASP.NET server control.<br><br>
          <Custom:FirstControl Message= "This control tells time. "  runat=server/> 
       <br>                               
      </form>
   </body>
</html>

参照

ASP.NET サーバー コントロールのプロパティ | ASP.NET サーバー コントロールのイベント