Поделиться через


Пошаговое руководство. Создание и использование пользовательского серверного элемента управления

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

В данном руководстве показывается, как создать, откомпилировать и использовать пользовательский серверный элемент управления ASP.NET на странице.

В процессе выполнения этого пошагового руководства вы научитесь:

  • Создавать серверный элемент управления ASP.NET.

  • Добавлять метаданные в элемент управления и его члены для управления безопасностью и функционированием во время разработки.

  • Использовать каталог App_Code веб-узла ASP.NET для проверки элемента управления без компиляции вручную.

  • Указывать префикс тега в файле конфигурации и сборке элемента управления.

  • Компилировать элемент управления в сборку и добавлять его в каталог Bin.

  • Встраивать растровое изображение в сборку элемента управления как значок панели элементов визуального конструктора.

  • Использовать откомпилированный элемент управления на странице.

Средство визуальной разработки, такое как Microsoft Visual Studio 2005, упрощает создание элементов управления, но не является необходимым для создания или построения пользовательских элементов управления. Элементы управления можно создавать с помощью любого текстового редактора и выполнять их построение из командной строки, используя компиляторы, являющиеся частью пакета SDK (пакет средств разработки программного обеспечения) для Windows. Независимо от того, как создается элемент управления, его внешний вид и поведение во время разработки в визуальном конструкторе будет одинаковым. Разработчик страницы может добавить элемент управления в панель элементов визуального конструктора, перетащить его на поверхность разработки и получить доступ к его свойствам и событиям в обозревателе свойств. В некоторых визуальных конструкторах, таких как Visual Studio 2005, пользовательский элемент управления также обладает поддержкой IntelliSense, не требуя при этом каких-либо действий со стороны разработчика.

Создание серверного элемента управления

Создаваемый элемент управления WelcomeLabel аналогичен элементу управления Label. Класс WelcomeLabel является производным от класса WebControl и определяет свойство Text, позволяющее разработчику страницы отображать текст приветствия, когда пользователь заходит на веб-узел. Класс WelcomeLabel добавляет имя пользователя в текстовую строку, если оно присутствует в заголовке, полученном от веб-обозревателя. Дополнительные сведения о получении имени пользователя см. в разделе User. Например, если разработчик присваивает свойству Text значение "Привет", то класс WelcomeLabel отображает "Привет, имя_пользователя!" или "Привет", в зависимости от того, содержит ли заголовок имя пользователя или нет.

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

  1. Создайте файл с именем WelcomeLabel.cs или WelcomeLabel.vb.

  2. Добавьте следующий код в исходный файл элемента управления:

    ' WelcomeLabel.vb
    Option Strict On
    Imports System
    Imports System.ComponentModel
    Imports System.Security.Permissions
    Imports System.Web
    Imports System.Web.UI
    Imports System.Web.UI.WebControls
    
    Namespace Samples.AspNet.VB.Controls
        < _
        AspNetHostingPermission(SecurityAction.Demand, _
            Level:=AspNetHostingPermissionLevel.Minimal), _
        AspNetHostingPermission(SecurityAction.InheritanceDemand, _
            Level:=AspNetHostingPermissionLevel.Minimal), _
        DefaultProperty("Text"), _
        ToolboxData( _
            "<{0}:WelcomeLabel runat=""server""> </{0}:WelcomeLabel>") _
        > _
        Public Class WelcomeLabel
            Inherits WebControl
            < _
            Bindable(True), _
            Category("Appearance"), _
            DefaultValue(""), _
            Description("The welcome message text."), _
            Localizable(True) _
            > _
            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 Sub RenderContents( _
                ByVal writer As HtmlTextWriter)
                writer.WriteEncodedText(Text)
                If Context IsNot Nothing Then
                    Dim s As String = Context.User.Identity.Name
                    If (s IsNot Nothing) AndAlso (s <> String.Empty) Then
                        Dim split() As String = s.Split("\".ToCharArray)
                        Dim n As Integer = split.Length - 1
                        If (split(n) <> String.Empty) Then
                            writer.Write(", ")
                            writer.Write(split(n))
                        End If
                    End If
                End If
                writer.Write("!")
            End Sub
        End Class
    End Namespace
    
    // WelcomeLabel.cs
    using System;
    using System.ComponentModel;
    using System.Security.Permissions;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace Samples.AspNet.CS.Controls
    {
        [
        AspNetHostingPermission(SecurityAction.Demand,
            Level = AspNetHostingPermissionLevel.Minimal),
        AspNetHostingPermission(SecurityAction.InheritanceDemand, 
            Level=AspNetHostingPermissionLevel.Minimal),
        DefaultProperty("Text"),
        ToolboxData("<{0}:WelcomeLabel runat=\"server\"> </{0}:WelcomeLabel>")
        ]
        public class WelcomeLabel : WebControl
        {
            [
            Bindable(true),
            Category("Appearance"),
            DefaultValue(""),
            Description("The welcome message text."),
            Localizable(true)
            ]
            public virtual string Text
            {
                get
                {
                    string s = (string)ViewState["Text"];
                    return (s == null) ? String.Empty : s;
                }
                set
                {
                    ViewState["Text"] = value;
                }
            }
    
            protected override void RenderContents(HtmlTextWriter writer)
            {
                writer.WriteEncodedText(Text);
                if (Context != null)
                {
                    string s = Context.User.Identity.Name;
                    if (s != null && s != String.Empty)
                    {
                        string[] split = s.Split('\\');
                        int n = split.Length - 1;
                        if (split[n] != String.Empty)
                        {
                            writer.Write(", ");
                            writer.Write(split[n]);
                        }
                    }
                }
                writer.Write("!");
            }
        }
    }
    

Рассмотрение кода

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

Если элемент управления отображает элемент пользовательского интерфейса или любой другой видимый элемент на клиенте, элемент управления следует наследовать от класса System.Web.UI.WebControls.WebControl (или производного от него класса). Если элемент управления отображает элемент, невидимый в клиентском обозревателе, например, скрытый элемент или элемент meta, элемент управления следует наследовать от класса System.Web.UI.Control. Класс WebControl является производным от класса Control и он добавляет свойства, связанные со стилем, такие как Font, ForeColor и BackColor. Кроме этого, элемент управления, производный от класса WebControl, участвует в темах ASP.NET, не требуя при этом каких-либо действий со стороны разработчика.

Если создаваемый элемент управления расширяет функциональность существующего элемента управления, такого как Button, Label или Image, наследование можно проводить от этого элемента управления. Поскольку элемент управления WelcomeLabel расширяет функциональность элемента Label, его можно наследовать от класса Label. Однако в данном пошаговом руководстве элемент управления WelcomeLabel наследуется от класса WebControl, чтобы продемонстрировать определение свойства и его метаданных.

В элементе управления WelcomeLabel определяется одно свойство, Text, и используются данные состояния просмотра для хранения его значения. Использование данных состояния просмотра сохраняет значение свойства Text во время выполнения обратной передачи. При каждой обратной передаче страница создается заново, и значения считываются из данных состояния просмотра. Если значение свойства Text не сохранить в данных состояния просмотра, оно принимает значение по умолчанию, Empty, при каждой обратной передаче. Свойство ViewState, унаследованное от класса WebControl, является словарем, хранящим значения данных. Значения вводятся и извлекаются с помощью элемента ключа String. В этом случае в качестве ключа используется "Text". Типом элементов словаря является Object, который необходимо преобразовать в тип свойства. Дополнительные сведения см. в разделе Общие сведения об управлении состоянием ASP.NET.

Элемент управления WelcomeLabel отображает свойство Text, переопределяя унаследованный метод RenderContents. Параметр, переданный в метод RenderContents, — это объект типа HtmlTextWriter, являющийся служебным классом, имеющим метод для отображения тегов и другой разметки HTML-кода (и HTML-варианта).

Следует отметить, что класс WelcomeLabel последовательно вызывает метод Write объекта HtmlTextWriter вместо конкатенации строк и вызова метода Write. Это повышает производительность, так как объект HtmlTextWriter выполняет запись напрямую в поток вывода. Для конкатенации строк требуется время и память, чтобы создать строку и затем выполнить запись в поток. При реализации отрисовки элементов управления необходимо следовать процедуре, описанной в этом руководстве.

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

В общем, если элемент управления наследуется от класса WebControl и отображает один элемент, следует переопределить метод RenderContents (но не метод Render) для визуализации содержимого внутри тегов элемента управления. Метод Render класса WebControl вызывает метод RenderContents после отрисовки открывающего тега элемента управления и его атрибутов стиля. При переопределении методаRender для записи содержимого элемент управления потеряет логику отрисовки стиля, встроенную в метод Render класса WebControl. Дополнительные сведения об отрисовке элемента управления, производного от класса WebControl см. в разделе Пример подготовки веб-элемента управления для отрисовки.

Атрибуты, применяемые к элементу управления WelcomeLabel, содержат метаданные, которые используются средой CLR и средствами времени разработки.

На уровне класса элемент управления WelcomeLabel отмечен атрибутами, перечисленными далее.

  • AspNetHostingPermissionAttribute — атрибут управления доступом для кода. Он приводит к тому, что JIT-компилятор проверяет, обладает ли код, связываемый с элементом управления WelcomeLabel, разрешением AspNetHostingPermission. Все открытые классы ASP.NET отмечены данным атрибутом. Следует применить атрибут AspNetHostingPermissionAttribute ко всем элементам управления для проверки безопасности не вполне надежного кода.

  • DefaultPropertyAttribute — это атрибут времени разработки, определяющий используемое по умолчанию свойство элемента управления. В визуальных конструкторах обозреватель свойств обычно выделяет свойство по умолчанию, когда разработчик щелкает элемент управления на поверхности разработки.

  • Атрибут ToolboxDataAttribute задает строку формата элемента. Эта строка становится разметкой элемента управления, если выполняется двойной щелчок элемента или его перемещают из панели элементов на поверхность разработки. Для элемента управления WelcomeLabel строка создает этот элемент:

    <aspSample:WelcomeLabel runat="server"> </aspSample:WelcomeLabel>
    

Элемент управления WelcomeLabel также наследует два атрибута от базового класса WebControl: ParseChildrenAttribute и PersistChildrenAttribute. Они применяются как ParseChildren(true) и PersistChildren(false). Эти атрибуты работают вместе с атрибутом ToolboxDataAttribute, вследствие чего дочерние элементы обрабатываются как свойства, а свойства сохраняются как атрибуты.

Далее перечислены атрибуты, применяемые к свойству Text класса WelcomeLabel, являющиеся стандартными атрибутами времени разработки, которые обычно применяются ко всем открытым свойствам используемых элементов управления.

  • Атрибут BindableAttribute, принимающий значение true или false, указывает визуальным конструкторам, имеет ли смысл привязывать свойство к данным. Например, в среде Visual Studio 2005, если свойство отмечено атрибутом Bindable(true), то свойство отображается в диалоговом окне Привязка данных. Если свойство не отмечено этим атрибутом, то обозреватель свойств присваивает ему значение Bindable(false).

  • Атрибут CategoryAttribute указывает, как классифицировать свойства в обозревателе свойств визуального конструктора элементов. Например, значение Category("Appearance") сообщает обозревателю свойств, что свойство следует отображать в категории Внешний вид, когда разработчик использует представление по категориям. Можно указать строковой аргумент, соответствующий существующей категории в обозревателе свойств, или можно создать собственную категорию.

  • Атрибут DescriptionAttribute задает краткое описание свойства. В среде Visual Studio 2005 обозреватель свойств отображает описание выбранного свойства в нижней части окна "Свойства".

  • Атрибут DefaultValueAttribute задает значение свойства по умолчанию. Это значение должно быть равно значению, возвращаемому методом получения доступа к свойству. В среде Visual Studio 2005 атрибут DefaultValueAttribute позволяет разработчику сбросить значение свойства в значение по умолчанию, вызвав контекстное меню в окне Свойства и нажав кнопку Сброс.

  • Атрибут LocalizableAttribute, принимающий значение true или false, указывает визуальным конструкторам, есть ли необходимость в локализации свойства. Если свойство отмечено как Localizable(true), то визуальный конструктор включает его при сериализации локализованных ресурсов. Конструктор сохраняет значение свойства в файлы ресурсов с нейтральным языком и региональными параметрами или другие источники локализации, если элемент управления опрашивается на наличие локализуемых свойств.

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

    Нельзя применять атрибут LocalizableAttribute к пользовательским серверным элементам управления в ASP.NET версии 1.0 и 1.1, так как в них модель локализации ASP.NET отличается.

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

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

Можно использовать функцию динамической компиляции ASP.NET для проверки элементов управления страницы без их компиляции в сборку. Файлы с исходным кодом из каталога App_Code динамически компилируются в корне веб-узла ASP.NET. Поэтому к классам в файлах с исходным кодом в каталоге App_Code можно обращаться из страниц без ручной компиляции в сборки. Если исходные файлы элемента управления разместить в каталоге App_Code, изменения в коде элементов управления незамедлительно отображаются на страницах, использующих их.

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

Каталог App_Code является новой возможностью, которая была недоступна в ASP.NET 1.0 и 1.1. Использование каталога App_Code для начального тестирования элемента управления необязательно. Основные шаги в построении серверного элемента управления аналогичны шагам в предыдущих версиях, как можно увидеть в следующем подразделе "Компиляция элемента управления в сборку".

Создание веб-узла ASP.NET и каталога App_Code

  1. Создайте веб-узел с именем ServerControlsTest. Можно создать веб-узел в IIS как виртуальный каталог с именем ServerControlsTest. Подробные сведения о создании и настройке виртуального каталога IIS см. в разделе Практическое руководство. Создание и настройка виртуальных каталогов в IIS 5.0 и 6.0.

  2. Создайте каталог App_Code в корневом каталоге веб-узла, который также называется корнем веб-приложения.

  3. Скопируйте исходный файл элемента управления (WelcomeLabel.cs или WelcomeLabel.vb) в каталог App_Code.

Создание префикса тега

Префикс тега — это префикс, такой как "asp" в <asp:Table />, который отображается перед именем типа элемента управления, когда элемент создается на странице декларативно. Чтобы разрешить использование элемента управления на странице с помощью объявления, компоненту ASP.NET требуется префикс тега, сопоставленный пространству имен элемента управления. Разработчик страницы может образовать префикс тега или сопоставление пространства имен, добавив директиву @ Register на каждую страницу, использующую пользовательский элемент управления, как показано в следующем примере:

<%@ Register TagPrefix="aspSample" 
        Namespace="Samples.AspNet.CS.Controls"%>

[Visual Basic]

<%@ Register TagPrefix="aspSample" 
        Namespace="Samples.AspNet.VB.Controls"%>
yhzc935f.alert_note(ru-ru,VS.90).gifПримечание.

Директива @ Register в ASP.NET 2.0 аналогична подобной директиве в ASP.NET 1.0 и ASP.NET 1.1. Если вы знакомы с директивой Register, использующейся в предыдущих версиях ASP.NET, то можно заметить, что атрибут assembly, задающий имя сборки элемента управления, отсутствует в предшествующей директиве Register. Если атрибут assembly отсутствует, ASP.NET предполагает, что сборка динамически компилируется из исходного файла в каталоге App_Code.

Вместо использования директивы @ Register на каждой ASPX-станице можно указать сопоставление префикса тега или пространства имен в файле Web.config. Это полезно, если пользовательский элемент управления будет использоваться на нескольких страницах в веб-приложении. В следующей процедуре описывается, как указать сопоставление префикса тега в файле Web.config.

Добавление сопоставления префикса тега в файле Web.config

  1. Создайте текстовый файл с именем Web.config в корневом каталоге веб-узла, если такого файла не существует.

  2. Если создается новый (пустой) файл Web.config, скопируйте в него следующий код и сохраните файл.

    <?xml version="1.0"?>
    <configuration>
      <system.web>    
       <pages>
         <controls>
           <add tagPrefix="aspSample"            namespace="Samples.AspNet.CS.Controls">       </add>
         </controls>
       </pages>
      </system.web>
    </configuration>
    
    <?xml version="1.0"?>
    <configuration>
      <system.web>    
       <pages>
         <controls>
           <add tagPrefix="aspSample"            namespace="Samples.AspNet.VB.Controls">       </add>
         </controls>
       </pages>
      </system.web>
    </configuration>
    

    Выделенный раздел показывает запись префикса тега, которая сопоставляет префикс тега "aspSample" пространству имен Samples.AspNet.CS.Controls или Samples.AspNet.VB.Controls.

  3. Если файл Web.config уже существует, добавьте выделенный текст из предыдущего шага как дочерний элемент controls файла конфигурации. Если элементы controls и pages не существуют в файле Web.config file, создайте их, как показано в предыдущем шаге.

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

    Запись префикса тега должна быть потомком раздела controls, который должен размещаться в разделе pages section, который в свою очередь должен быть потомком раздела system.web.

После того как в файле конфигурации указано сопоставление префиксов тегов, можно декларативно использовать элемент управления WelcomeLabel (как <aspSample:WelcomeLabel />) на любой странице веб-узла.

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

Запись конфигурации префикса тега — это новая возможность ASP.NET 2.0. В ASP.NET 1.0 и 1.1 сопоставление префикса тега указывалось в директиве @ Register на каждой странице, использующей пользовательский элемент управления.

Создание страницы, использующей элемент управления

Чтобы создать страницу, использующую элемент управления, выполните следующие действия

  1. Создайте в веб-узле текстовый файл с именем WelcomeLabelTest.aspx.

  2. Скопируйте следующую разметку в файле WelcomeLabelTest.aspx и сохраните его.

    <%@ Page Language="VB"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" >
      <head id="Head1" runat="server">
        <title>WelcomeLabel Test</title>
      </head>
      <body>
        <form id="form1" runat="server">
          <div>
            <aspSample:WelcomeLabel Text="Hello" ID="WelcomeLabel1" 
              runat="server" BackColor="Wheat" ForeColor="SaddleBrown" />
          </div>
        </form>
      </body>
    </html>
    
    <%@ Page Language="C#"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" >
      <head id="Head1" runat="server">
        <title>WelcomeLabel Test</title>
      </head>
      <body>
        <form id="form1" runat="server">
          <div>
            <aspSample:WelcomeLabel Text="Hello" ID="WelcomeLabel1" 
              runat="server" BackColor="Wheat" ForeColor="SaddleBrown" />
          </div>
        </form>
      </body>
    </html>
    
  3. Откройте страницу WelcomeLabelTest.aspx в обозревателе, введя в строке адреса следующий URL-адрес:

    https://localhost/ServerControlsTest/WelcomeLabelTest.aspx
    
  4. Внесите изменения в исходный код элемента управления. Например, запишите дополнительную строку, добавьте эту строку кода в конец метода RenderContents:

    writer.Write("Testing how the App_Code directory works.");
    
    writer.Write("Testing how the App_Code directory works.")
    
  5. Обновите страницу WelcomeLabelTest.aspx в обозревателе.

    Изменения элемента управления будут отображены на странице даже без компиляции элемента управления.

Кроме свойства Text элемента управления WelcomeLabel, заданного явно, в экземпляре элемента управления на странице можно увидеть, что в нем есть свойства BackColor и ForeColor, которые не были определены. Элемент управления WelcomeLabel получает их и другие свойства, связанные со стилем, при наследовании от класса WebControl. Кроме этого, элементу управления WelcomeLabel можно назначить обложку, а также сделать его частью темы без каких-либо действий со стороны разработчика.

Компиляция элемента управления в сборку

Хотя каталог позволяет тестировать элемент управления без компиляции, его можно скомпилировать, если нужно распределить как объектный код другим разработчикам. Кроме того, элемент управления невозможно добавить в панель элементов визуального конструктора, пока он не скомпилирован в сборку.

Компиляция элемента управления в сборку

  1. Задайте переменную PATH среды Windows компьютера, чтобы включить путь в установку .NET Framework с помощью этих шагов:

    1. В Windows щелкните правой кнопкой Мой компьютер, выберите Свойства, Дополнительно, а — Переменные среды.

    2. В списке Системные переменные дважды щелкните переменную Path.

    3. В поле Значение переменной добавьте точку с запятой (;) в конец существующих значений текстового поля и введите путь установки платформы .NET Framework. Обычно платформа .NET Framework устанавливается в папку установки Windows в \Microsoft.NET\Framework\номер_версии.

    4. Нажмите кнопку ОК, чтобы закрыть каждое диалоговое окно.

  2. Выполните следующую команду из каталога, созданного для исходных файлов в первой процедуре данного пошагового руководства.

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

    Он отличается от каталога App_Code, в который скопированы исходные файлы элемента управления для тестирования.

    csc /t:library /out:Samples.AspNet.CS.Controls.dll /r:System.dll /r:System.Web.dll *.cs
    
    vbc /t:library /out:Samples.AspNet.VB.Controls.dll /r:System.dll /r:System.Web.dll *.vb
    

    Параметр компилятора /t:library указывает компилятору создать библиотеку вместо исполняемой сборки. Параметр /out предоставляет имя для сборки, а параметр /r — список сборок, связанных с текущей сборкой.

Чтобы сохранить этот пример автономно, пошаговое руководство предложит создать сборку с одним элементом управления. Как правило, руководства по разработке платформы .NET Framework рекомендуют не создавать сборки, содержащие всего несколько классов. Для простого развертывания нужно создать столько сборок, сколько возможно.

Внедрение значка в сборку элемента управления

Визуальный конструктор, такой как Visual Studio 2005, обычно использует значок по умолчанию (например, изображение шестеренки) для отображения элемента управления в панели элементов. Можно настроить внешний вид элемента управления в панели элементов, встроив растровое изображение размером 16 на 16 точек в сборку элемента управления. По соглашению визуальные конструкторы используют цвет нижней левой точки растрового изображения в качестве прозрачного цвета.

Внедрение значка в сборку элемента управления

  1. Создайте или найдите растровое изображение размером 16 на 16 точек, которое будет использоваться в качестве значка для элемента управления.

  2. Назовите его WelcomeLabel.bmp.

  3. Добавьте файл растрового изображения в каталог (CustomControlsCS или CustomControlsVB), где расположены файлы с кодом для элемента управления WelcomeLabel.

  4. Из папки, содержащей исходные файлы, выполните следующую команду:

    csc /res:WelcomeLabel.bmp,Samples.AspNet.CS.Controls.WelcomeLabel.bmp 
    /t:library /out:Samples.AspNet.CS.Controls.dll /r:System.dll 
    /r:System.Web.dll *.cs
    
    vbc /res:WelcomeLabel.bmp,Samples.AspNet.VB.Controls.WelcomeLabel.bmp 
    /t:library /out:Samples.AspNet.VB.Controls.dll /r:System.dll 
    /r:System.Web.dll *.vb
    

    Эта команда компилирует элемент управления и встраивает растровое изображение в сборку в качестве ресурса. Этому ресурсу необходимо дать такое же имя, как имя, квалифицированное для пространства имен имя элемента управления, с которым он связан. Например, если имя элемента управления —Samples.AspNet.CS.Controls.WelcomeLabel, то имя встроенного изображения должно быть Samples.AspNet.CS.Controls.WelcomeLabel.bmp. Это соглашение об именовании приводит к тому, что визуальный конструктор автоматически использует растровое изображение как значок панели элементов элемента управления. Если соглашение об именовании не используется, к элементу управления следует применить атрибут ToolboxBitmapAttribute, чтобы указать имя встроенного ресурса растрового изображения.

Использование TagPrefixAttribute для предоставления сопоставления префиксов тегов и пространств имен

Ранее в этом руководстве при использовании каталога App_Code directory можно было увидеть, как разработчик страницы может указать префикс тега на странице или в файле Web.config. При необходимости можно указать префикс тега по умолчанию, который должен использовать визуальный конструктор для элемента управления, включив атрибут уровня сборки System.Web.UI.TagPrefixAttribute. Атрибут TagPrefixAttribute полезен, так как предоставляет префикс тега для использования его визуальным конструктором, если конструктор не обнаружил сопоставление префиксов тегов в файле Web.config или в директиве Register на странице. Префикс тега регистрируется со страницей при первом двойном щелчке элемента управления в панели элементов или перетаскивании его с панели элементов на страницу.

Если решено использовать атрибут TagPrefixAttribute, можно указать его в отдельном файле, скомпилированном с элементами управления. По соглашению об именах файл получает AssemblyInfo.languageExtension, например, AssemblyInfo.cs или AssembyInfo.vb. В следующей процедуре описано, как указать метаданные TagPrefixAttribute.

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

Если не указать TagPrefixAttribute в сборке элемента управления, и разработчик страницы не укажет сопоставление префиксов тегов и пространства имен на странице или в файле Web.config, визуальный конструктор должен будет создать префикс тега по умолчанию. Например, Visual Studio 2005 создаст собственный тег (например, cc1) для элемента управления при его перетаскивании из панели элементов.

Добавление сопоставления пространства имен или префикса тега при помощи атрибута TagPrefixAttribute

  1. Создайте файл с именем AssemblyInfo.cs или AssemblyInfo.vb в каталоге исходного кода и добавьте следующий код в файл.

    using System;
    using System.Web.UI;
    [assembly: TagPrefix("Samples.AspNet.CS.Controls", "aspSample")]
    
    Imports System
    Imports System.Web.UI
    <Assembly: TagPrefix("Samples.AspNet.VB.Controls", "aspSample")> 
    

    Атрибут префикса тега создает сопоставление между пространством имен Samples.AspNet.CS.Controls или Samples.AspNet.VB.Controls и префиксом aspSample.

  2. Перекомпилируйте все исходные файлы с помощью команды компиляции, которая использовалась ранее (с внедренным ресурсом или без него).

Использование откомпилированного пользовательского элемента управления на странице ASP.NET

Для проверки откомпилированной версии пользовательского элемента управления следует обеспечить страницам веб-узла доступ к сборке элемента управления.

Обеспечение доступа к сборке элемента управления для веб-узла

  1. Создайте каталог Bin в корневом каталоге веб-узла.

  2. Скопируйте сборку элемента управления (Samples.AspNet.CS.Controls.dll или Samples.AspNet.VB.Controls.dll) в каталог Bin.

  3. Удалите файл с исходным кодом элемента управления из каталога App_Code.

    Если этого не сделать, тип элемента управления будет существовать в откомпилированной сборке и в сборке, динамически созданной ASP.NET. Это создаст неоднозначную ссылку при загрузке элемента управления, и любая страница, на которой используется этот элемент управления, создаст ошибку компилятора.

Созданная в этом руководстве сборка называется закрытой сборкой, потому что ее необходимо размещать в каталоге Bin веб-узла ASP.NET, чтобы его страницы могли использовать пользовательский элемент управления. К этой сборке нельзя обратиться из других приложений, если ее копия также не установлена этими приложениями. Если создаются элементы управления для общих приложений, размещенных на узле, как правило, элементы управления упаковываются в закрытую сборку. Однако если элементы управления создаются для использования в специальной среде размещения или создается набор сборок, который поставщик Интернет-услуг делает доступными всем их потребителям, элементы управления нужно упаковать в общие сборки (строго поименованные), установленные в глобальный кэш сборок. Дополнительные сведения см. в разделе Работа со сборками и глобальным кэшем сборок.

Затем следует изменить сопоставление префикса тега, созданное в файле Web.config, указав имя сборки.

Изменение сопоставления префикса тега в файле Web.config

  • Добавьте в файл Web.config атрибут assembly к элементу addtagPrefix:

    <controls>
      <add tagPrefix="aspSample"   
        namespace="Samples.AspNet.CS.Controls" 
        assembly="Samples.AspNet.CS.Controls">
      </add>
    </controls>
    
    <controls>
      <add tagPrefix="aspSample"   
        namespace="Samples.AspNet.VB.Controls" 
        assembly="Samples.AspNet.VB.Controls">
      </add>
    </controls>
    

Атрибут assembly определяет имя сборки, содержащей элемент управления. Элемент addtagPrefix сопоставляет префикс тега с сочетанием пространства имен и сборки. Если сборка динамически генерируется компонентом ASP.NET из исходных файлов в каталоге App_Code, атрибут сборки не требуется. Если атрибут сборки не используется, ASP.NET загружает тип элемента управления из сборок, созданных динамически в каталоге App_Code.

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

  • Откройте страницу WelcomeLabelTest.aspx в обозревателе, введя в строке адреса следующий URL-адрес:

    https://localhost/ServerControlsTest/WelcomeLabelTest.aspx
    

Если элемент управления используется в визуальном конструкторе, таком как Visual Studio 2005, можно добавить элемент управления в панель элементов, перетащить его с панели элементов в рабочую область конструирования и получить доступ к свойствам и событиям в обозревателе свойств. Дополнительно, в среде Visual Studio 2005 элемент управления имеет полную поддержку в представлении исходного кода разработчика страницы и в редакторе кода. Это включает завершение операторов в блоке script и поддержку обозревателя свойств, когда разработчик щелкает тег элемента управления.

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

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

Следующие действия

В этом руководстве показано, как можно разработать простой пользовательский серверный элемент управления ASP.NET и использовать его на странице. Показано, как задать свойство и выполнить компиляцию элемента управления в сборку. Дополнительные сведения об отрисовке, задании свойства, сохранении состояния и реализации составных элементов управления см. в разделе Разработка пользовательских серверных элементов управления ASP.NET.

В пошаговом руководстве показано, что для элемента управления можно задать пользовательский значок в панели элементов. Также описано, как добавлять метаданные времени разработки для настройки поддержки обозревателя свойств для пользовательского элемента управления. Сложные элементы управления, такие как GridView, обладают еще большей функциональностью во время разработки за счет использования классов визуального конструктора, предоставляющих другой интерфейс пользователя во время разработки и выполнения. Объектная модель конструктора ASP.NET 2 для серверных элементов управления значительно отличается от модели, использующейся в ASP.NET 1.0 и 1.1. Дополнительные сведения о реализации пользовательских классов конструктора в ASP.NET 2.0 см. в разделе Общие сведения о конструкторах элементов управления ASP.NET.

В ASP.NET 2.0 серверный элемент управления может определять разное поведения клиентских обозревателей или устройств, использующих классы адаптеров. Дополнительные сведения см. в разделе Developing Adapters for ASP.NET Server Controls.

Различные обозреватели, как и версии одного обозревателя, поддерживают различные функции. Серверные элементы управления ASP.NET автоматически определяют обозреватель, запросивший ASPX-страницу, и форматируют разметку HTML, генерируемую для этого обозревателя. Тем не менее, некоторые функциональные возможности элементов управления не работают в более старых версиях обозревателей, поэтому рекомендуется проверять страницы в максимально возможном количестве разных типов обозревателей, чтобы убедиться, что во всех обозревателях страницы выглядят надлежащим образом. Дополнительные сведения см. в разделе Серверные веб-элементы управления ASP.NET и возможности обозревателей.

См. также

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

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