Compartilhar via


Como: Usar controles de servidor ASP.NET personalizado no Visual Studio

Você pode disponibilizar os controles de servidor personalizados na Caixa de ferramentas do Visual Studio, definindo os atributos apropriados em tempo de design a serem usados pelo designer visual.Os procedimentos a seguir criam um controle simples chamado MailLink, inclua-o na Caixa de ferramentas e use-o para criar um link de e-mail em uma página Web, processando um elemento <a> de hyperlink com uma URL mailto:.

Para criar um controle personalizado que contém atributos em tempo de design

  1. No Visual Studio, crie um projeto de biblioteca e defina uma classe personalizada que derive de WebControl, conforme mostrado no exemplo a seguir.

    Observação:

    O código-fonte completo é listado na seção Exemplo.

    <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. Adicione atributos em tempo de design para fornecer metadados personalizados que serão usados para exibir o controle no designer visual em tempo de design.Os seguintes dois atributos de design são os únicos necessários para tornar o controle MailLink disponível na Caixa de ferramentas do Visual Studio.

    O atributo TagPrefix especifica o prefixo na frente do nome de controle MailLink.Juntos, o prefixo e o nome do controle definem o nome da marca para o controle personalizado (neste caso, <Sample:MailLink> </Sample:MailLink>).

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

    O atributo ToolboxData especifica a marca padrão gerada para o controle MailLink quando ele é arrastado da Caixa de ferramentas a uma página em tempo de 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. Compile o controle MailLink em uma biblioteca e nomeie-o MaiLink.Dll.

Para adicionar o controle personalizado à Caixa de ferramentas

  1. No menu Exibir, clique em Caixa de Ferramentas.

  2. Na Caixa de ferramentas, clique com o botão direito do mouse e selecione Escolher itens.

  3. Na caixa de diálogo Escolher itens da Caixa de ferramentas, selecione a guia Componentes do .NET Framework e, em seguida, clique no botão Procurar para localizar o MailLink.Dll que você acabou de criar.

  4. Selecione a caixa de seleção para o controle MailLink e clique em OK.

    O controle MailLink personalizado aparece na Caixa de ferramentas.

  1. Crie um novo projeto da Web.Em seguida, crie uma página denominada MailLink.aspx.Esta página conterá uma das diretivas a seguir, dependendo da linguagem selecionada para o projeto.

    <%@ page language="VB" %>
    
    <%@ page language="C#" %>
    
  2. Adicione a seguinte estrutura de página básica para hospedar o controle 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. Alterne para modo de design e arraste o controle MailLink para sua página.

    O Visual Studio adiciona dois itens à página: uma diretiva Register para o MailLink controle e o nome de marca das MailLink controle para usar na página.

  4. Execute a página em um navegador e clique no link Mail Webmaster.

    Uma mensagem de email abre, endereçada ao endereço especificado da propriedade Email do controle.

Exemplo

O controle MailLink substitui a propriedade TagKey para processar um elemento <a>, em vez do elemento padrão <span> processado pela 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);
        }
    }
}

The MailLink controle também demonstra a persistência de texto interno. MailLink permite que um desenvolvedor de página especificar o Text propriedade sistema autônomo Rótulos do controle, conforme mostrado no exemplo a seguir.

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

A persistência interna está em contraste com a persistência padrão da marca de abertura do controle, como no exemplo a seguir:

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

O código anterior é a marca padrão gerada para o controle quando ele é arrastado da Caixa de ferramentas para uma página.

Compilando o código

No Visual Studio, crie um projeto de biblioteca e defina uma classe personalizada que derive de WebControl, conforme mostrado no procedimento acima.O código-fonte completo é listado na seção de código anterior.

Segurança

Os controles personalizados do servidor estendem a funcionalidade do ASP.NET e devem seguir algumas diretrizes de segurança precisas.Em particular, você precisa considerar o seguinte:

  • Segurança em tempo de execução e em tempo de design.

  • Controles personalizados em assemblies com nomes fortes.

  • Segurança do sistema operacional e listas de controle de acesso (ACLs) no servidor que hospeda o controle de servidor personalizado.

  • Segurança de acesso ao código para restringir os recursos os quais o controle pode acessar.

  • Assemblies gerenciados no cache de assembly global.

Consulte também

Conceitos

Atributos de tempo de design para componentes

Atributos e suporte do tempo de design

Protegendo Controles Personalizados do Servidor

Outros recursos

Desenvolvendo Controles Personalizados ASP.NET Server