Condividi tramite


Procedura: utilizzare controlli server ASP.NET personalizzati in Visual Studio

Aggiornamento: novembre 2007

I controlli server personalizzati possono essere resi disponibili nella Casella degli strumenti di Visual Studio definendo gli attributi della fase di progettazione appropriati da utilizzare in una finestra di progettazione visiva. Nelle procedure seguenti viene creato un controllo semplice denominato MailLink, che viene quindi incluso nella Casella degli strumenti e utilizzato per creare un collegamento di posta elettronica in una pagina Web eseguendo il rendering di un elemento <a> di collegamento ipertestuale con un mailto:.

Per creare un controllo personalizzato che contiene attributi della fase di progettazione

  1. In Visual Studio creare un progetto di libreria e definire una classe personalizzata derivata da WebControl, come illustrato nell'esempio seguente.

    Nota:

    Nella sezione Esempio è riportato il codice sorgente completo.

    <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. Aggiungere attributi della fase di progettazione per fornire metadati personalizzati che saranno utilizzati per visualizzare il controllo nella finestra di progettazione visiva in fase di progettazione. I due attributi di progettazione seguenti sono gli unici necessari per rendere il controllo MailLink disponibile nella Casella degli strumenti di Visual Studio.

    L'attributo TagPrefix specifica il prefisso davanti al nome del controllo MailLink. Insieme, il prefisso e il nome del controllo definiscono il nome del tag per il controllo personalizzato, in questo caso, <Sample:MailLink> </Sample:MailLink>.

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

    L'attributo ToolboxData specifica il tag predefinito generato per il controllo MailLink quando viene trascinato dalla Casella degli strumenti in una pagina in fase di progettazione.

    <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. Compilare il controllo MailLink in una libreria e assegnargli il nome MaiLink.Dll.

Per aggiungere il controllo personalizzato alla Casella degli strumenti

  1. Scegliere Casella degli strumenti dal menu Visualizza.

  2. Nella Casella degli strumenti fare clic con il pulsante destro del mouse e scegliere Scegli elementi.

  3. Nella finestra di dialogo Scegli elementi della Casella degli strumenti selezionare la scheda Componenti di .NET Framework e quindi fare clic sul pulsante Sfoglia per individuare MailLink.Dll.

  4. Selezionare la casella di controllo del controllo MailLink e quindi fare clic su OK.

    Il controllo personalizzato MailLink verrà visualizzato nella Casella degli strumenti.

  1. Creare un nuovo progetto Web. Creare quindi una pagina denominata MailLink.aspx. In questa pagina sarà inclusa una delle direttive seguenti, a seconda del linguaggio selezionato per il progetto.

    <%@ page language="VB" %>
    
    <%@ page language="C#" %>
    
  2. Aggiungere la struttura di base della pagina seguente per includere il controllo 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. Passare alla visualizzazione Progettazione e trascinare il controllo MailLink sulla pagina.

    Visual Studio aggiunge due elementi alla pagina: la direttiva Register per il controllo MailLink e il nome del tag del controllo MailLink da utilizzare nella pagina.

  4. Eseguire la pagina in un browser e fare clic sul collegamento Mail Webmaster.

    Viene visualizzato un messaggio di posta elettronica, diretto all'indirizzo specificato dalla proprietà Emaildel controllo.

Esempio

Il controllo MailLink esegue l'override della proprietà TagKey per eseguire il rendering di un elemento <a> invece di eseguire il rendering di un elemento predefinito <span> con 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);
        }
    }
}

Il controllo MailLink mostra anche la persistenza interna del testo. MailLink consente allo sviluppatore della pagina di specificare la proprietà Text racchiusa tra i tag del controllo, come illustrato nell'esempio seguente.

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

La persistenza interna è al contrario della persistenza predefinita nel tag di apertura del controllo, come illustrato nell'esempio seguente.

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

Il codice precedente è il tag predefinito generato per il controllo quando viene trascinato dalla Casella degli strumenti in una pagina.

Compilazione del codice

In Visual Studio creare un progetto di libreria e definire una classe personalizzata derivata da WebControl, come illustrato nella procedura riportata sopra. Nella sezione di codice precedente è riportato il codice sorgente completo.

Sicurezza

I controlli server personalizzati estendono la funzionalità di ASP.NET e devono rispettare alcune linee guida di sicurezza precise. In particolare è necessario tenere conto di quanto segue:

  • Sicurezza in fase di progettazione e di esecuzione.

  • Controlli personalizzati in assembly con nome sicuro.

  • Sicurezza del sistema operativo ed elenchi di controllo di accesso nel server in cui si trova il controllo server personalizzato.

  • Sicurezza relativa all'accesso al codice per limitare le risorse a cui può accedere il controllo.

  • Assembly gestiti nella Global Assembly Cache.

Vedere anche

Concetti

Attributi per componenti in fase di progettazione

Attributi e supporto in fase di progettazione

Protezione di controlli server personalizzati

Altre risorse

Sviluppo di controlli server ASP.NET personalizzati