次の方法で共有


方法 : Visual Studio でカスタム ASP.NET サーバー コントロールを使用する

更新 : 2007 年 11 月

ビジュアル デザイナで使用するデザイン時の適切な属性を定義することで、Visual Studio ツールボックスで使用できるカスタム サーバー コントロールを作成できます。次の手順では、MailLink という単純なコントロールを作成し、ツールボックスに追加します。また、そのコントロールを使用し、mailto: URL が指定されたハイパーリンクの <a> 要素をレンダリングすることで Web ページに電子メール リンクを作成します。

デザイン時の属性を含むカスタム コントロールを作成するには

  1. Visual Studio でライブラリ プロジェクトを作成し、WebControl から派生するカスタム クラスを定義します。次に例を示します。

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

    完全なコード例は「例」のセクションに示します。

    <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.
        }
    
    }
    
  2. デザイン時の属性を追加し、デザイン時にビジュアル デザイナにコントロールを表示するときに使用するカスタム メタデータを指定します。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>")]
    
  3. ライブラリの MailLink コントロールをコンパイルし、MaiLink.Dll と名前を付けます。

カスタム コントロールをツールボックスに追加するには

  1. [表示] メニューの [ツールボックス] をクリックします。

  2. ツールボックスの [アイテムの選択] を右クリックして選択します。

  3. [ツールボックス アイテムの選択] ダイアログ ボックスの [.NET Framework コンポーネント] タブを選択し、[参照] ボタンをクリックして、ビルドする MailLink.Dll を検索します。

  4. MailLink コントロールのチェック ボックスをオンにし、[OK] をクリックします。

    カスタムの MailLink コントロールがツールボックスに表示されます。

  1. 新しい Web プロジェクトを作成します。MailLink.aspx というページを作成します。このページには、プロジェクトで選択した言語に応じて、次のいずれかのディレクティブが含まれます。

    <%@ page language="VB" %>
    
    <%@ page language="C#" %>
    
  2. 次の基本的なページ構造を追加し、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>
    
  3. デザイン ビューに切り替え、MailLink コントロールをページにドラッグします。

    2 つのアイテムがページに追加されます。MailLink のレジスタ ディレクティブと、ページに使用する MailLink コントロールのタグ名です。

  4. ブラウザでページを実行し、[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)

  • コントロールがアクセスできるリソースを制限するコード アクセス セキュリティ

  • グローバル アセンブリ キャッシュのマネージ アセンブリ

参照

概念

コンポーネントのデザイン時属性

属性とデザイン時サポート

カスタム サーバー コントロールのセキュリティ保護

その他の技術情報

ASP.NET カスタム サーバー コントロールの開発