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

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

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

Атрибуты

Наличие атрибутов — важное свойство языков .NET. С их помощью в метаданные класса в сборку добавляется информация, которая используется самым различным образом. Атрибуты — это классы, наследующие System.Attribute и применяющиеся к пространствам имен, классам, свойствам и методам. Синтаксис применения атрибута в C#:

[CustomAttr(Update:=true, Keep=false)]

Конструктор атрибута указывается в квадратных скобках с параметрами, которые определены в декларации класса атрибута.

В ASP .NET атрибуты в том числе определяют поведение пользовательских элементов управления (а также, например, используются в описании web-сервисов). В описании WebCustomControl1 атрибуты применены и к самому классу, и к свойству Text. Атрибуты класса определяют его помещение в панель Toolbox и в дизайнере страниц. Их можно поделить на 3 категории: атрибуты, помогающие среде разработки работать с элементом управления в режиме дизайна; атрибуты, управляющие выводом дочерних элементов; атрибуты, определяющие его поведение в панели инструментов.

DefaultProperty определяет свойство по умолчанию. При открытии окна свойств элемента управления в дизайнере помеченное этим атрибутом свойство будет выделено бежевым.

ToolboxData задает форматирующую строку. Например,

ToolboxData("<{0}:WebCustomControl1 
runat=server></{0}:WebCustomControl1>")

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

Когда в дизайнере страницы происходит двойной щелчок мыши на элементе, среда разработки создает обработчик события, например, SelectedIndexChanged для выпадающего списка DropDownList. Какое именно событие, определяется атрибутом DefaultEvent.

Атрибуты применяются также к свойствам и событиям элемента.

Bindable указывает, что свойство можно связать с источником данных.

Category обозначает категорию в окне свойств элемента. Свойства разбиваются на категории, если выбрать представление Categorized окна свойств.

Атрибут Themable определяет, может ли данное свойство определяться в файле скина.

По умолчанию ASP .NET позволяет всем свойствам написанных нами элементов управления быть описанными в файлах скинов. Это не всегда удобно, если свойство не относится к внешнему виду элемента. В таком случае атрибут создается с параметром false:

[Themeable(false)]
    public string Text

Browsable указывает, будет ли отображаться свойство в окне свойств, и EditorBrowsable — возможно ли будет его редактировать.

Существуют и другие атрибуты.

Отрисовка (Rendering) элемента управления

В этом примере построен элемент управления, наследующий от Label. Он раскрашивает текст в случайные цвета. Свойство EnableRainbowMode можно отключить, тогда он станет вести себя как обычная метка:

[ToolboxData("<{0}:RainbowLabel 
runat=server></{0}:RainbowLabel>")]
  public class RainbowLabel : Label
  {
    [Bindable(true)]
    [Category("Appearance")]
    [DefaultValue("true")]
    [Localizable(true)]
    public bool EnableRainbowMode
    {
      get
      {
        if (ViewState["EnableRainbowMode"] == null)
          return true;
        else
          return 
bool.Parse(ViewState["EnableRainbowMode"].ToString());
      }
      set
      {
        ViewState["EnableRainbowMode"] = value;
      }
    }

    protected override void RenderContents(HtmlTextWriter output)
    {
      if(EnableRainbowMode)
        output.Write(ColorizeString(Text));
      else
        output.Write(Text);
    }
    private string ColorizeString(string input)
    {
      StringBuilder output = new StringBuilder(input.Length);
      Random rand = new Random(DateTime.Now.Millisecond);

      for (int i = 0; i < input.Length; i++)
      {
        int color = rand.Next(0xffffff);
        string strColor = string.Format(@"<span style=""color: 
#{0:x}"">", color);
        output.Append(strColor);
        output.Append(input.Substring(i, 1));
        output.Append("</span>");
      }
      return output.ToString();
    }
  }
< Лекция 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