Практическое руководство. Использование пользовательских серверных элементов управления ASP.NET в Visual Studio

Обновлен: Ноябрь 2007

Пользовательские серверные элементы управления становятся доступными в панели элементов Visual Studio путем задания соответствующих атрибутов времени разработки, которые позволяют использовать эти элементы управления в визуальном конструкторе. Следующие процедуры создают простой элемент управления с именем MailLink, добавляют его в панель элементов и используют его для создания ссылки электронной почты на веб-странице путем представления элемента гиперссылки <a> в виде URL mailto:.

Создание пользовательского элемента управления, содержащего атрибуты времени разработки

  1. В Visual Studio создайте проект библиотеки и определите пользовательский класс, производный от WebControl, как показано в следующем примере.

    ms366537.alert_note(ru-ru,VS.90).gifПримечание.

    Полный текст примера приведен в подразделе "Пример".

    <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. Добавьте атрибуты времени разработки для предоставления пользовательских метаданных, которые будут использоваться для отображения элемента управления в визуальном конструкторе во время разработки. Следующие два атрибута режима проектирования являются единственными, необходимыми для того, чтобы элементы управления MailLink стали доступны в панели элементов Visual Studio.

    Атрибут TagPrefix задает префикс в начале имени элемента управления MailLink. Совместно префикс и имя элемента управления определяют имя тега для пользовательского элемента управления (в данном случае — <Sample:MailLink> </Sample:MailLink>).

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

    Атрибут ToolboxData задает тег по умолчанию, который создается для элемента управления MailLink при его перетаскивании из панели элементов на страницу в режиме разработки.

    <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. Скомпилируйте элемент управления MailLink в библиотеку и назовите ее MaiLink.Dll.

Добавление пользовательского элемента управления в панель элементов

  1. В меню Вид выберите пункт Панель элементов.

  2. В панели элементов щелкните правой кнопкой мыши и выберите команду Выбрать элементы.

  3. В диалоговом окне Выбор элементов панели элементов перейдите на вкладку Компоненты .NET Framework и нажмите кнопку Обзор, чтобы найти только что построенную библиотеку MailLink.Dll.

  4. Установите флажок для элемента управления MailLink и нажмите кнопку OK.

    Пользовательский элемент управления MailLink появится в панели элементов.

  1. Создайте новый веб-проект. Затем создайте страницу с именем MailLink.aspx. Эта страница будет содержать одну из следующих директив, в зависимости от выбранного для проекта языка:

    <%@ page language="VB" %>
    
    <%@ page language="C#" %>
    
  2. Добавьте следующий HTML-код, представляющий структуру основной страницы для размещения элемента управления MailLink.

    <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. Переключитесь в режим разработки и перетащите элемент управления MailLink на страницу.

    Visual Studio добавит два элемента на страницу: директиву Register для элемента управления MailLink и имя тега элемента управления MailLink для использования на странице.

  4. Запустите страницу в обозревателе и щелкните ссылку Mail Webmaster (написать веб-мастеру).

    Откроется почтовое сообщение, адрес назначения которого указан свойством Email элемента управления.

Пример

Элемент управления MailLink переопределяет свойство TagKey для отрисовки элемента <a> вместо элемента по умолчанию <span>, представляемого классом 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);
        }
    }
}

Элемент управления MailLink также демонстрирует персистентность внутреннего текста. MailLink позволяет разработчику страницы указывать свойство Text в тегах элемента управления, как показано в следующем примере:

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

Внутренняя персистентность отличается от персистентности по умолчанию, используемой в открывающем теге элемента управления, как в следующем примере:

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

Приведенный выше код представляет тег по умолчанию, созданный для элемента управления при его перетаскивании из панели элементов на страницу.

Компиляция кода

В Visual Studio создайте проект библиотеки и определите пользовательский класс, производный от WebControl, как показано в приведенной выше процедуре. Полный исходный код приведен в предыдущем разделе.

Безопасность

Пользовательские серверные элементы управления расширяют функциональные возможности ASP.NET и должны соответствовать определенным рекомендациям по обеспечению безопасности. В частности, необходимо учитывать следующее:

  • Безопасность времени выполнения и времени разработки.

  • Пользовательские элементы управления в сборках со строгими именами.

  • Безопасность операционной системы и списков управления доступом (ACL) на том сервере, на котором выполняется пользовательский серверный элемент управления.

  • Управление доступом для кода для ограничения ресурсов, доступных элементу управления.

  • Управляемые сборки в глобальном кэше сборок.

См. также

Основные понятия

Атрибуты времени разработки для компонентов

Атрибуты и поддержка во время разработки

Пользовательские серверные элементы управления безопасностью

Другие ресурсы

Разработка пользовательских серверных элементов управления ASP.NET