https://technet.microsoft.com/en-us/library/ms143221(v=sql.105).aspx |
Пользовательские и собственные серверные элементы управления
Пользовательские элементы управления
Мы познакомились с большим количеством встроенных в ASP.NET элементов управления.
Хотя набор стандартных элементов велик — всегда может понадобиться такой элемент, которого в стандартной поставке нет. Или есть страница с такой функциональностью, которую хочется использовать и на других страницах. Можно, конечно воспользоваться клеем и ножницами (Copy-Paste), но сущность объектно-ориентированного и компонентного программирования — в повторном использовании кода, заключенного в готовые компоненты. Следовательно, нужно научиться создавать собственные элементы управления.
Пользовательские элементы управления инкапсулируют несколько готовых элементов в одном контейнере, который можно повторно использовать в проекте. Они наследуются от класса UserControl — наследника класса Control. Пользовательские элементы компилируются точно так же, как и страницы aspx.
Серверные элементы, кроме этого, реализуют собственное поведение и самостоятельно выводят HTML-код, который их отображает. Они могут наследоваться от WebControl или одного из классов стандартных элементов управления. Их можно использовать в любых проектах и распространять в виде откомпилированной PE (Portable Executable) сборки.
Мы знаем, что класс Page наследует класс Control, как и все элементы управления, некоторые прямо, а другие через класс WebControl или HtmlControl. Следовательно, между написанием страницы и разработкой собственного элемента управления должно быть много общего. У них тоже есть свой жизненный цикл. В классе Control определены события Init, Load, DataBinding, PreRender, Unload, Disposed. Свойства, которые Control предоставляет своим наследникам, включают EnableViewState, ID, UniqueID, Page, Parent, SkinID, ViewState и Controls — коллекция дочерних элементов управления.
Класс Control предоставляет возможность помещать элемент управления в дерево элементов управления, которые отображаются на странице .aspx. Класс Control также реализует интерфейс System.ComponentModel. IComponent, который делает компонент конструктивным. Конструктивный компонент может быть добавлен в панель Toolboox визуального дизайнера, может быть помещен на разрабатываемую страницу методом drag-and-drop, может отображать свойства в окне свойств и обеспечивать другие виды поддержки режима разработки (в том числе Smart Tags).
Пользовательские элементы управления можно создавать в визуальном редакторе по той же модели, что и страницы aspx. Как всегда, откроем диалог NewFile и выберем тип страницы Web User Control. Расширение файла с дизайном элемента — ascx, а с кодом класса — ascx.cs. В отличие от страниц aspx, сам по себе пользовательский элемент нельзя увидеть в браузере, для этого он должен находиться на какой-нибудь странице:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl.ascx.cs" Inherits="WebUserControl" %>
Как упоминалось в "лекции 2" , директива Control — это аналог директивы Page для элемента управления. На странице не указываются теги <html> и <body>, потому что содержание элемента включается в код страницы, в котором он содержится. Изначально в элементе вообще нет никаких тегов.
Класс пользовательского элемента управления — наследник System.Web.UI.UserControl. В остальном он ничем не отличается от файла с классом страницы:
public partial class WebUserControl : System.Web.UI.UserControl { }
Можно добавить в него любые элементы управления и HTML-код:
<h1><%= Greeting %>, <%= Name %>!</h1> <asp:TextBox ID="txtName" runat="server"></asp:TextBox><br /> <asp:Button ID="btnClick" runat="server" Text="Button" />
В классе элемента управления определим его свойства:
string name; string greeting; public string Greeting { get { return greeting; } set { greeting = value; } } public string Name { get { return name; } set { name = value; } } protected void Page_Init(object sender, EventArgs e) { btnClick.Text = "Enter your name and click"; }
При нажатии на кнопку свойства элемента заполняются данными из текстового поля:
protected void btnClick_Click(object sender, EventArgs e) { Name = txtName.Text; }
Теперь перетащите название элемента из Solution Explorer на любую страницу.
Чтобы использовать пользовательский элемент на странице, его надо зарегистрировать. Директива Register появляется автоматически:
<%@ Register Src=" WebUserControl.ascx" TagPrefix="User" TagName="GreetingControl" %>