Partager via


Comment : utiliser des contrôles serveur ASP.NET personnalisés dans Visual Studio

Mise à jour : novembre 2007

Vous pouvez rendre vos contrôles serveur personnalisés disponibles dans la boîte à outils Visual Studio en définissant les attributs de design appropriés que le concepteur visuel doit utiliser. Les procédures suivantes créent un contrôle simple nommé MailLink, l'incluent dans la boîte à outils et l'utilisent pour créer un lien de messagerie électronique dans une page Web en restituant un élément <a> de lien hypertexte avec une URL mailto:.

Pour créer un contrôle personnalisé qui contient des attributs de design

  1. Dans Visual Studio, créez un projet de bibliothèque et définissez une classe personnalisée qui dérive de WebControl, comme illustré dans l'exemple suivant.

    Remarque :

    Le code source complet est présenté dans la section Exemple.

    <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. Ajoutez des attributs de design pour fournir des métadonnées personnalisées qui seront utilisées pour afficher le contrôle dans le concepteur visuel au moment du design. Les deux attributs de design suivants sont les seuls nécessaires pour rendre le contrôle MailLink disponible dans la boîte à outils Visual Studio.

    L'attribut TagPrefix spécifie le préfixe devant le nom de contrôle MailLink. Ensemble, le préfixe et le nom de contrôle définissent le nom de balise pour le contrôle personnalisé (dans ce cas, <Sample:MailLink> </Sample:MailLink>).

    <Assembly: TagPrefix("Samples.AspNet", "Sample")> 
    
    [assembly:TagPrefix("Samples.AspNet", "Sample")]
    

    L'attribut ToolboxData spécifie la balise par défaut générée pour le contrôle MailLink lorsqu'il est déplacé de la boîte à outils vers une page au moment du design.

    <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. Compilez le contrôle MailLink dans une bibliothèque et nommez-le MaiLink.Dll.

Pour ajouter le contrôle personnalisé à la boîte à outils

  1. Dans le menu Affichage, cliquez sur Boîte à outils.

  2. Dans la boîte à outils, cliquez avec le bouton droit et sélectionnez Choisir les éléments.

  3. Dans la boîte de dialogue Choisir des éléments de boîte à outils, sélectionnez l'onglet Composants .NET Framework, puis cliquez sur le bouton Parcourir pour localiser la MailLink.Dll que vous venez de générer.

  4. Activez la case à cocher pour le contrôle MailLink, puis cliquez sur OK.

    Le contrôle MailLink personnalisé apparaît dans la boîte à outils.

  1. Créez un projet Web. Créez ensuite une page nommée MailLink.aspx. Cette page contiendra l'une des directives suivantes, selon le langage que vous avez sélectionné pour le projet.

    <%@ page language="VB" %>
    
    <%@ page language="C#" %>
    
  2. Ajoutez la structure de page simple suivante pour héberger le contrôle MailLink.

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head >
        <title>Using the MailLink control</title>
    </head>
    <body>
    <h1>Using the MailLink Custom Server Control</h1>
        <form id="form1" >
        <div>
    
       </div>
    
        </form>
    </body>
    </html>
    
  3. Basculez en mode Design et faites glisser le contrôle MailLink sur votre page.

    Visual Studio ajoute deux éléments à la page : une directive Register pour le contrôle MailLink et le nom de balise du contrôle MailLink à utiliser dans la page.

  4. Exécutez la page dans un navigateur et cliquez sur le lien Mail Webmaster.

    Un message électronique s'ouvre, à destination de l'adresse spécifiée par la propriété Email du contrôle.

Exemple

Le contrôle MailLink substitue la propriété TagKey pour rendre un élément <a> au lieu de l'élément <span> par défaut rendu par la classe WebControl.

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);
        }
    }
}

Le contrôle MailLink illustre également la persistance du texte interne. MailLink permet à un développeur de pages de spécifier la propriété Text dans les balises du contrôle, comme illustré dans l'exemple suivant :

<Sample:MailLink id="MaillinkID" Email="Webmaster@contoso.com" 
    >
 Mail Support Team
</Sample:MailLink>

La persistance interne s'oppose à la persistance par défaut sur la balise d'ouverture du contrôle, comme dans l'exemple suivant :

<Sample:MailLink Text="Mail Webmaster"  > </Sample:MailLink>

Le code précédent est la balise par défaut générée pour le contrôle lorsqu'il est déplacé de la boîte à outils vers une page.

Compilation du code

Dans Visual Studio, créez un projet de bibliothèque et définissez une classe personnalisée qui dérive de WebControl, comme illustré dans la procédure ci-dessus. Le code source complet est présenté dans la section de code précédente.

Sécurité

Les contrôles serveur personnalisés étendent les fonctionnalités d'ASP.NET et doivent respecter des consignes de sécurité précises. En particulier, vous devez prendre en compte les éléments suivants :

  • Sécurité au moment de l'exécution et au moment du design.

  • Contrôles personnalisés dans les assemblys avec nom fort.

  • Sécurité du système d'exploitation et listes de contrôle d'accès sur le serveur qui héberge le contrôle serveur personnalisé.

  • Sécurité d'accès du code pour restreindre les ressources auxquelles le contrôle peut accéder.

  • Assemblys managés dans le Global Assembly Cache.

Voir aussi

Concepts

Attributs en mode design pour les composants

Attributs et prise en charge au moment du design

Sécurisation des contrôles serveur personnalisés

Autres ressources

Développement de contrôles serveur ASP.NET personnalisés