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
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. } }
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>")]
Compilare il controllo MailLink in una libreria e assegnargli il nome MaiLink.Dll.
Per aggiungere il controllo personalizzato alla Casella degli strumenti
Scegliere Casella degli strumenti dal menu Visualizza.
Nella Casella degli strumenti fare clic con il pulsante destro del mouse e scegliere Scegli elementi.
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.
Selezionare la casella di controllo del controllo MailLink e quindi fare clic su OK.
Il controllo personalizzato MailLink verrà visualizzato nella Casella degli strumenti.
Per fare riferimento al controllo MailLink in una pagina
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#" %>
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>
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.
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