Sdílet prostřednictvím


Gewusst wie: Verwenden von benutzerdefinierten ASP.NET-Serversteuerelementen in Visual Studio

Aktualisiert: November 2007

Sie können benutzerdefinierte Serversteuerelemente in der Visual Studio-Toolbox verfügbar machen, indem Sie die vom visuellen Designer zu verwendenden Entwurfszeitattribute definieren. In den folgenden Verfahren wird beschrieben, wie Sie ein einfaches Steuerelement namens MailLink erstellen, zur Toolbox hinzufügen und zum Erstellen eines E-Mail-Links in einer Webseite verwenden, indem Sie ein <a>-Linkelement mit einer mailto:-URL rendern.

So erstellen Sie ein benutzerdefiniertes Steuerelement mit Entwurfszeitattributen

  1. Erstellen Sie in Visual Studio ein Bibliotheksprojekt, und definieren Sie eine benutzerdefinierte Klasse, die von WebControl abgeleitet wird, wie im folgenden Beispiel gezeigt.

    ms366537.alert_note(de-de,VS.90).gifHinweis:

    Der vollständige Quellcode wird im Beispielabschnitt aufgelistet.

    <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. Fügen Sie Entwurfszeitattribute hinzu, um benutzerdefinierte Metadaten bereitzustellen, die verwendet werden, um das Steuerelement zur Entwurfszeit im visuellen Designer anzuzeigen. Um das MailLink-Steuerelement in der Visual Studio-Toolbox verfügbar zu machen, werden lediglich die beiden folgenden Entwurfszeitattribute benötigt.

    Das TagPrefix-Attribut gibt das Präfix vor dem Steuerelementnamen MailLink an. Zusammen definieren das Präfix und der Steuerelementname den Tagnamen für das benutzerdefinierte Steuerelement (in diesem Fall <Sample:MailLink> </Sample:MailLink>).

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

    Das ToolboxData-Attribut gibt das Standardtag an, das für das MailLink-Steuerelement generiert wird, wenn es zur Entwurfszeit aus der Toolbox in eine Seite gezogen wird.

    <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. Kompilieren Sie das MailLink-Steuerelement in einer Bibliothek, und nennen Sie es MaiLink.Dll.

So fügen Sie das benutzerdefinierte Steuerelement der Toolbox hinzu

  1. Klicken Sie im Menü Ansicht auf Toolbox.

  2. Klicken Sie in der Toolbox mit der rechten Maustaste, und wählen Sie Elemente auswählen aus.

  3. Wählen Sie im Dialogfeld Toolboxelemente auswählen die Registerkarte .NET Framework-Komponenten aus, und klicken Sie auf die Schaltfläche Durchsuchen, um das zuvor erstellte MailLink.Dll-Steuerelement zu suchen.

  4. Aktivieren Sie das Kontrollkästchen für das MailLink-Steuerelement, und klicken Sie auf OK.

    Das benutzerdefinierte MailLink-Steuerelement wird in der Toolbox angezeigt.

  1. Erstellen Sie ein neues Webprojekt. Erstellen Sie anschließend eine Seite mit dem Namen MailLink.aspx. Diese Seite enthält je nach Programmiersprache, die Sie für das Projekt ausgewählt haben, eine der folgenden Direktiven.

    <%@ page language="VB" %>
    
    <%@ page language="C#" %>
    
  2. Fügen Sie die folgende einfache Seitenstruktur hinzu, um das MailLink-Steuerelement zu hosten.

    <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. Wechseln Sie zur Entwurfsansicht, und ziehen Sie das MailLink-Steuerelement auf die Seite.

    Visual Studio fügt der Seite zwei Elemente hinzu: eine Registrierungsdirektive für das MailLink-Steuerelement und den auf der Seite zu verwendenden Tagnamen des MailLink-Steuerelements.

  4. Führen Sie die Seite in einem Browser aus, und klicken Sie auf den Link Mail Webmaster.

    Es wird eine E-Mail-Nachricht mit der Adresse geöffnet, die von der Email-Eigenschaft des Steuerelements angegeben wird.

Beispiel

Das MailLink-Steuerelement überschreibt die TagKey-Eigenschaft, um ein <a>-Element anstelle eines standardmäßigen <span>-Elements zu rendern, das von der WebControl-Klasse gerendert wurde.

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

Das MailLink-Steuerelement veranschaulicht auch die innere Textdauerhaftigkeit. Mit dem MailLink-Steuerelement kann ein Seitenentwickler die Text-Eigenschaft innerhalb der Steuerelementtags angeben, wie im folgenden Beispiel gezeigt:

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

Die innere Dauerhaftigkeit steht im Gegensatz zur Standarddauerhaftigkeit des Steuerelementstarttags, wie das folgende Beispiel zeigt:

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

Der voranstehende Code gibt das Standardtag an, das für das Steuerelement generiert wird, wenn es aus der Toolbox in eine Seite gezogen wird.

Kompilieren des Codes

Erstellen Sie in Visual Studio ein Bibliotheksprojekt, und definieren Sie eine benutzerdefinierte Klasse, die vonWebControl abgeleitet wird, wie oben gezeigt. Der vollständige Quellcode wird im vorhergehenden Codeabschnitt aufgelistet.

Sicherheit

Benutzerdefinierte Serversteuerelemente erweitern die Funktionalität von ASP.NET und müssen bestimmten Sicherheitsrichtlinien folgen. Insbesondere muss Folgendes beachtet werden:

  • Laufzeit- und Entwurfszeitsicherheit.

  • Benutzerdefinierte Steuerelemente in Assemblys mit starkem Namen.

  • Betriebssystemsicherheit und Zugriffssteuerungslisten (ACLs) auf dem Server, der das benutzerdefinierte Serversteuerelement hostet.

  • Codezugriffssicherheit, um die Ressourcen einzuschränken, auf die das Steuerelement zugreifen kann.

  • Verwaltete Assemblys im globalen Assemblycache.

Siehe auch

Konzepte

Entwurfszeitattribute für Komponenten

Attribute und Entwurfszeitunterstützung

Sichern von benutzerdefinierten Serversteuerelementen

Weitere Ressourcen

Entwickeln von benutzerdefinierten ASP.NET-Serversteuerelementen