方法 : Visual Studio でカスタム ASP.NET サーバー コントロールを使用する
更新 : 2007 年 11 月
ビジュアル デザイナで使用するデザイン時の適切な属性を定義することで、Visual Studio ツールボックスで使用できるカスタム サーバー コントロールを作成できます。次の手順では、MailLink という単純なコントロールを作成し、ツールボックスに追加します。また、そのコントロールを使用し、mailto: URL が指定されたハイパーリンクの <a> 要素をレンダリングすることで Web ページに電子メール リンクを作成します。
デザイン時の属性を含むカスタム コントロールを作成するには
Visual Studio でライブラリ プロジェクトを作成し、WebControl から派生するカスタム クラスを定義します。次に例を示します。
メモ : 完全なコード例は「例」のセクションに示します。
<Assembly: TagPrefix("Samples.AspNet", "Sample")> Namespace Samples.AspNet < _ ToolboxData("<{0}:MailLink ID='MailLinkID' Text='WebMaster' runat=""server""> </{0}:MailLink>")> _ Public Class MailLink Inherits WebControl ' Custom code goes here. End Class End Namespace
[assembly:TagPrefix("Samples.AspNet", "Sample")] namespace Samples.AspNet { [ ToolboxData("<{0}:MailLink ID='MailLinkID' Text='WebMaster' runat=\"server\"> </{0}:MailLink>") ] public class MailLink : WebControl { // Custom code goes here. } }
デザイン時の属性を追加し、デザイン時にビジュアル デザイナにコントロールを表示するときに使用するカスタム メタデータを指定します。Visual Studio ツールボックスで使用できる MailLink コントロールを作成するために必要なデザイン属性は、次の 2 つのみです。
TagPrefix 属性は、MailLink というコントロールの前にプレフィックスを指定します。プレフィックスとコントロール名を組み合わせて、カスタム コントロールのタグ名が定義されます (この場合、<Sample:MailLink> </Sample:MailLink>)。
<Assembly: TagPrefix("Samples.AspNet", "Sample")>
[assembly:TagPrefix("Samples.AspNet", "Sample")]
ToolboxData 属性は、デザイン時にツールボックスからページにドラッグすると、MailLink コントロール用に生成された既定のタグを指定します。
<ToolboxData("<{0}:MailLink ID='MailLinkID' Text='Mail Webmaster' runat='server'"> </{0}:MailLink>")>
[ToolboxData("<{0}:MailLink ID='MailLinkID' Text='Mail Webmaster' runat=\"server\"> </{0}:MailLink>")]
ライブラリの MailLink コントロールをコンパイルし、MaiLink.Dll と名前を付けます。
カスタム コントロールをツールボックスに追加するには
[表示] メニューの [ツールボックス] をクリックします。
ツールボックスの [アイテムの選択] を右クリックして選択します。
[ツールボックス アイテムの選択] ダイアログ ボックスの [.NET Framework コンポーネント] タブを選択し、[参照] ボタンをクリックして、ビルドする MailLink.Dll を検索します。
MailLink コントロールのチェック ボックスをオンにし、[OK] をクリックします。
カスタムの MailLink コントロールがツールボックスに表示されます。
ページの MailLink コントロールを参照するには
新しい Web プロジェクトを作成します。MailLink.aspx というページを作成します。このページには、プロジェクトで選択した言語に応じて、次のいずれかのディレクティブが含まれます。
<%@ page language="VB" %>
<%@ page language="C#" %>
次の基本的なページ構造を追加し、MailLink コントロールをホストします。
<html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Using the MailLink control</title> </head> <body> <h1>Using the MailLink Custom Server Control</h1> <form id="form1" runat="server"> <div> </div> </form> </body> </html>
デザイン ビューに切り替え、MailLink コントロールをページにドラッグします。
2 つのアイテムがページに追加されます。MailLink のレジスタ ディレクティブと、ページに使用する MailLink コントロールのタグ名です。
ブラウザでページを実行し、[Web マスタにメールを送信] リンクをクリックします。
コントロールの Email プロパティで指定したアドレス宛てのメール メッセージが開きます。
使用例
MailLink コントロールは、TagKey プロパティをオーバーライドし、WebControl クラスがレンダリングする既定の <span> 要素の代わりに <a> 要素をレンダリングします。
Imports System
Imports System.ComponentModel
Imports System.Security
Imports System.Security.Permissions
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
<Assembly: TagPrefix("Samples.AspNet", "Sample")>
Namespace Samples.AspNet
<AspNetHostingPermission( _
SecurityAction.Demand, _
Level:=AspNetHostingPermissionLevel.Minimal), _
AspNetHostingPermission( _
SecurityAction.InheritanceDemand, _
Level:=AspNetHostingPermissionLevel.Minimal), _
ParseChildren(True, "Text"), _
DefaultProperty("Email"), _
ToolboxData("<{0}:MailLink ID='MailLinkID' Text='Mail Web Master' runat=""server""> </{0}:MailLink>")> _
Public Class MailLink
Inherits WebControl
<Browsable(True), Category("Appearance"), _
DefaultValue("webmaster@contoso.com"), _
Description("The e-mail address.")> _
Public Overridable Property Email() As String
Get
Dim s As String = CStr(ViewState("Email"))
If s Is Nothing Then s = "webmaster@contoso.com"
Return s
End Get
Set(ByVal value As String)
ViewState("Email") = value
End Set
End Property
<Browsable(True), Category("Appearance"), _
DefaultValue("Web Master"), _
Description("The name to display."), _
Localizable(True), _
PersistenceMode(PersistenceMode.InnerDefaultProperty)> _
Public Overridable Property [Text]() As String
Get
Dim s As String = CStr(ViewState("Text"))
If s Is Nothing Then s = String.Empty
Return s
End Get
Set(ByVal value As String)
ViewState("Text") = value
End Set
End Property
Protected Overrides ReadOnly Property TagKey() _
As HtmlTextWriterTag
Get
Return HtmlTextWriterTag.A
End Get
End Property
Protected Overrides Sub AddAttributesToRender(ByVal writer _
As HtmlTextWriter)
MyBase.AddAttributesToRender(writer)
writer.AddAttribute( _
HtmlTextWriterAttribute.Href, "mailto:" + Email)
End Sub 'AddAttributesToRender
Protected Overrides Sub RenderContents(ByVal writer _
As HtmlTextWriter)
If [Text] = String.Empty Then
[Text] = Email
End If
writer.WriteEncodedText([Text])
End Sub 'RenderContents
End Class 'MailLink
End Namespace
using System;
using System.ComponentModel;
using System.Security;
using System.Security.Permissions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
[assembly:TagPrefix("Samples.AspNet", "Sample")]
namespace Samples.AspNet
{
[
AspNetHostingPermission(SecurityAction.Demand,
Level = AspNetHostingPermissionLevel.Minimal),
AspNetHostingPermission(SecurityAction.InheritanceDemand,
Level = AspNetHostingPermissionLevel.Minimal),
ParseChildren(true, "Text"),
DefaultProperty("Email"),
ToolboxData("<{0}:MailLink ID='MailLinkID' Text='Mail Web Master' runat=\"server\"> </{0}:MailLink>")
]
public class MailLink : WebControl
{
[
Browsable(true),
Category("Appearance"),
DefaultValue("webmaster@contoso.com"),
Description("The e-mail address.")
]
public virtual string Email
{
get
{
string s = (string)ViewState["Email"];
return (s == null) ? "webmaster@contoso.com" : s;
}
set
{
ViewState["Email"] = value;
}
}
[
Browsable(true),
Category("Appearance"),
DefaultValue("Web Master"),
Description("The name to display."),
Localizable(true),
PersistenceMode(PersistenceMode.InnerDefaultProperty)
]
public virtual string Text
{
get
{
string s = (string)ViewState["Text"];
return (s == null) ? String.Empty : s;
}
set
{
ViewState["Text"] = value;
}
}
protected override HtmlTextWriterTag TagKey
{
get
{
return HtmlTextWriterTag.A;
}
}
protected override void AddAttributesToRender(
HtmlTextWriter writer)
{
base.AddAttributesToRender(writer);
writer.AddAttribute(HtmlTextWriterAttribute.Href,
"mailto:" + Email);
}
protected override void RenderContents(HtmlTextWriter writer)
{
if (Text == String.Empty)
{
Text = Email;
}
writer.WriteEncodedText(Text);
}
}
}
MailLink コントロールは内部のテキストの永続性も示します。ページの開発者は MailLink を使用して、次の例のようにコントロールのタグ内に Text プロパティを指定できます。
<Sample:MailLink id="MaillinkID" Email="Webmaster@contoso.com"
runat="server">
Mail Support Team
</Sample:MailLink>
内部の永続性は、次の例のようなコントロールの開始タグの既定の永続性とは対照的です。
<Sample:MailLink Text="Mail Webmaster" runat="server" > </Sample:MailLink>
前のコードは、ツールボックスからページにドラッグしたときにコントロール用に生成される既定のタグです。
コードのコンパイル方法
前述の手順で示したように、Visual Studio でライブラリ プロジェクトを作成し、WebControl から派生するカスタム クラスを定義します。完全なコード例は前述のコードのセクションに示します。
セキュリティ
カスタム サーバー コントロールは、ASP.NET の機能を拡張します。また、精密なセキュリティ ガイドラインに従う必要があります。特に、次の点を考慮する必要があります。
実行時とデザイン時のセキュリティ
厳密な名前を指定したアセンブリのカスタム コントロール
カスタム サーバー コントロールをホストするサーバーに関する、オペレーティング システムのセキュリティとアクセス制御リスト (ACL)
コントロールがアクセスできるリソースを制限するコード アクセス セキュリティ
グローバル アセンブリ キャッシュのマネージ アセンブリ