単純 ASP.NET サーバー コントロールの開発
このトピックでは、1 つのプロパティを持ち、イベントを発生させたり処理したりしない単純カスタム サーバー コントロールを作成する手順を示します。
単純 ASP.NET サーバー コントロールを作成するには
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 ディレクティブを使用すると、完全限定名を使用せずに、名前空間から型を参照できます。したがって、Control は System.Web.UI.Control. として解決されます。
定義したコントロールを名前空間に格納します。新しい名前空間を定義するか、または既存の名前空間を使用できます。名前空間の名前は、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
コントロールに必要なプロパティを定義します。
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
プロパティの詳細については、「プロパティの概要」を参照してください。ラウンド トリップの間に状態を維持するプロパティを定義する場合は、「コントロールの状態の維持」を参照してください。
定義したコントロールが 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 がそのまま HtmlTextWriter の Write メソッドに文字列引数として渡されています。HtmlTextWriter のメソッドを使用して HTML の表示を単純化する方法、および WebControl から派生させたコントロールを表示する方法については、「ASP.NET サーバー コントロールのレンダリング」を参照してください。
この例では、わかりやすくするために、Control から
FirstControl
を派生させています。独自の表示を実行するコントロールを作成する場合は、コントロールが UI 固有のプロパティを継承できるように、System.Web.UI.WebControls.WebControl から派生させてください。実行時属性とデザイン時属性を追加して、必要に応じてコントロールにカスタム メタデータを提供します。実行時属性が必須であるコントロールもあります。実行時属性を必要とするコントロールには、テンプレートを公開するコントロール、データ連結を実行するコントロール、カスタム解析ロジックが必要なコントロールなどがあります。実行時属性の例については、「テンプレート コントロールの開発」を参照してください。コントロールを 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
デザイン時属性の詳細については、「コンポーネントのデザイン時属性」および「属性とデザイン時サポート」を参照してください。
作成したコントロールを保存、コンパイル、および配置するには、次の手順を実行します。
- アプリケーションのルート ディレクトリに、/bin という名前のサブディレクトリを作成します。
- ソース ファイルをアセンブリ (.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>