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

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

< Лекция 13 || Лекция 14: 12345 || Лекция 15 >

Атрибут TagPrefix директивы Register задает префикс, с помощью которого данный пользовательский элемент можно создавать на страницах aspx. Его значение может быть любым, кроме asp, которое зарезервировано для встроенных элементов управления ASP .NET. TagName — это имя элемента, идущее после префикса; атрибут Src определяет путь к файлу пользовательского элемента управления.

Теперь новый пользовательский элемент управления можно описать так:

<User:GreetingControl id="Hello" runat="server" Name="Heinrich"
     Greeting="Guten Tag"/>

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

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

В коде страницы можно манипулировать его свойствами:

protected void Page_Load(object sender, EventArgs e)
  {
    Hello.Greeting = "Привет";
  }

Пользовательский элемент может получить доступ к странице, в которой находится, через свойство Parent. Если в родительскую форму добавить TextBox, он может прочитать его значение и использовать его:

<asp:TextBox ID="txtGreeting" 
runat="server"></asp:TextBox><br />
      <User:GreetingControl id="Hello2" runat="server" 
Name="Heinrich"
     Greeting="Guten Tag" OnLoad="Hello2_Load"/>

  protected void btnClick_Click(object sender, EventArgs e)
  {
    Name = txtName.Text;
    TextBox tb=Parent.FindControl("txtGreeting") as TextBox;
    if ( tb!= null)
    {
      Greeting = tb.Text;
    }
  }

Только что созданный элемент управления можно даже добавить в панель инструментов, и перетаскивать оттуда на любую страницу. Но директиву Register придется добавлять самим.

Можно попробовать создать WebUserControl в событии Page_Load, но это не даст результата. Причина в том, что класс объявлен лишь частично в файле отделенного кода, в нем не хватает функции отрисовки, которая появится при обработке страницы ascx ASP .NET.

Чтобы программно создать экземпляр пользовательского элемента управления, нужно вызвать функцию LoadControl, который вернет экземпляр класса System.Web.UI.Control, содержащий загружаемый элемент управления. Чтобы иметь доступ к свойствам класса WebUserControl, нужно преобразование типа. И, как и всякий другой элемент управления, загруженный пользовательский элемент управления может быть добавлен в коллекцию элементов управления web-формы. Его нельзя добавить в страницу, так как его составной частью является кнопка, которая может находиться только в форме:

WebUserControl wuc = 
(WebUserControl)Page.LoadControl("WebUserControl.ascx");
    wuc.Greeting = "Здоровеньки булы";
    wuc.Name = "Тарас";
    form1.Controls.AddAt(0, wuc);

Более полезный пользовательский элемент управления — нижний колонтитул любой страницы. Его можно поместить на шаблон дизайна. Он может отобразить юридическую информацию, адрес web-мастера и дату последнего обновления:

<%@ Control Language="C#" AutoEventWireup="true" 
CodeFile="Footerl.ascx.cs" Inherits="Footerl" %>
Copyright &copy; <asp:Label ID="lblYear"
runat="server" /> by Your Company Name.<br />

Замечания, комментарии, проблемы? Свяжитесь с web-мастером 
<asp:Label ID="lblEmail" runat="server" /><br />
Дата последней модификации этой страницы: <asp:Label 
ID="lblLastMod" runat="server" /><br />

Текст в элементах Label меняется в обработчике Page_Load.

protected void Page_Load(object sender, EventArgs e)
  {
    lblYear.Text = DateTime.Now.Year.ToString();
    lblEmail.Text = "<a href='mailto:webmaster@"
       + Request.Url.Host.Replace("www.", "") + 
"'>webmaster</a>";
    lblLastMod.Text = 
System.IO.File.GetLastWriteTime(Server.MapPath(Request.Url.LocalPa
th)).ToLongDateString();
  }
< Лекция 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

Александр Шнайдман
Александр Шнайдман
Израиль, Тель Авив