Опубликован: 14.11.2006 | Доступ: свободный | Студентов: 5898 / 532 | Оценка: 4.18 / 3.74 | Длительность: 16:37:00
ISBN: 978-5-9556-0085-7
Лекция 14:

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

< Лекция 13 || Лекция 14: 12345 || Лекция 15 >
Аннотация: Как создать свой собственный элемент управления.

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

Мы познакомились с большим количеством встроенных в 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" %>
< Лекция 13 || Лекция 14: 12345 || Лекция 15 >
Алексей Савельев
Алексей Савельев

https://technet.microsoft.com/en-us/library/ms143221(v=sql.105).aspx

Денис Прокофьев
Денис Прокофьев

Везде написано, что это самый независимый и простой в использовании навигационный элемент управления, что он работает сразу с web.sitemap и не требует определения SiteMapDataSource.

Моя карта сайта состоит из двух страниц, вложенных друг в друга. asp:Menu, asp:TreeView отбображаются как ожидалось, а вот asp:SiteMapPath - нет. Он не виден нигде. Однако на его месте формируется разметка: <span id="SiteMapPath1"><a href="#SiteMapPath1_SkipLink" style="position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden;">Проход по ссылкам навигации</a><a id="SiteMapPath1_SkipLink"></a></span> - т.е. элемент отрабатывает.

В словах xHTML это выглядит так: <asp:SiteMapPath ID="SiteMapPath1" runat="server" />. Причем не важно - внутри тега form или снаружи - всегда одинаково.

Т.к. другие нав. ЭУ работают через простой источник данных без ошибок, делаю вывод - карта составлена правильно. ИД: <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />

Карта: <?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode url="~/L11_1_simplePage.aspx" title="Страница 1"  description="Простая страница 1." >
    <siteMapNode url="~/L11_1SimplePage2.aspx" title="Страница 2"  description="Простая страница 2" />
  </siteMapNode>
</siteMap>

Почему так происходит? Вроде делаю все по примерам. VS Community 2015. NetFramework в проекте: v4.0.30319