Серверные элементы управления
Серверные элементы управления, унаследованные от WebControl или Control, сложнее создавать, но у них еще больше возможностей. Такие элементы имеют собственные методы генерации HTML-кода. Сложность в том, что здесь класс полностью описывается программистом, без визуального дизайна и файла ascx. В классе WebControl определены визуальные свойства, такие как BackColor, Font, ToolTip. В них можно определить сложную логику пользовательского интерфейса. Если элемент управления не нуждается в таких свойствах, его нужно наследовать от Control. При этом он генерирует HTML-код, например теги <meta> или скрытые элементы.
Серверные элементы управления могут быть построены по-разному. Во-первых, они могут просто переопределять метод RenderContents, так что во время выполнения на их месте появится кусок кода HTML. Во-вторых, могут создавать сложные элементы, которые служат контейнерами. Также можно наследовать имеющиеся элементы управления и добавлять к ним новую функциональность. При поддержке некоторых интерфейсов серверные элементы управления поддерживают связывание с данными и создание шаблонов.
Серверные элементы управления помещаются в библиотеки WebControls. Чтобы создать библиотеку, в меню File выберите New Project, и в появившемся диалоге — тип проекта Web Control Library (он находится в узле Visual C#-Windows). В проекте уже создан простейший серверный элемент управления. Библиотеку можно создать только в Visual Studio, а в VWD — только класс в папке App_Code:
namespace WebControlLibrary1 { [DefaultProperty("Text")] [ToolboxData("<{0}:WebCustomControl1 runat=server></{0}:WebCustomControl1>")] public class WebCustomControl1 : WebControl { [Bindable(true)] [Category("Appearance")] [DefaultValue("")] [Localizable(true)] public string Text { get { String s = (String)ViewState["Text"]; return ((s == null) ? String.Empty : s); }
set { ViewState["Text"] = value; } }
protected override void RenderContents(HtmlTextWriter output) { output.Write(Text); } } }
У этого элемента всего одно свойство Text, и он просто записывает в поток вывода страницы HTML значение этого свойства.
Если в решении есть проект с библиотекой пользовательских элементов, они автоматически добавляются в инструментальную панель (Toolbox). Для этого достаточно всего лишь скомпилировать проект. В папке Bin появляется WebControlLibrary1.dll. Это сборка, в которой находятся все элементы управления библиотеки.
Если вы работаете не с Visual Studio, все равно можно откомпилировать классы в сборку .dll из командной строки1).
csc /t:library /out: WebControlLibrary1.dll /r:System.dll /r:System.Web.dll *.cs
В панели инструментов появится новая секция со значками-шестеренками, и элементы управления можно перетаскивать оттуда на страницы.
Директива Register, которая автоматически добавляется, будет содержать название этой сборки и пространство имен, в котором находится элемент управления:
<%@ Register Assembly="WebControlLibrary1" Namespace="WebControlLibrary1" TagPrefix="cc1" %>
Чтобы не писать одну и ту же директиву на многих страницах, библиотеку можно зарегистрировать в файле web.config.
У созданного элемента, кроме свойства Text, есть все свойства внешнего вида и поведения, как у стандартных элементов управления, как вы можете убедиться, открыв его окно свойств. Он очень похож на элемент Label.
Доступ к сборке WebControlLibrary1.dll можно предоставить всем приложениям, если поместить ее в глобальный кэш сборок.