Книга: C# для профессионалов. Том II

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

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

Теперь мы рассмотрим, как можно транслировать код ASP.NET каждого варианта выбора в элемент управления, который является потомком элемента управления StrawPoll. Чтобы сделать это, необходимо ассоциировать построитель элемента управления с классом StrawPoll с помощью атрибута ControlBuilderAttribute. Нам нужно также определить, что элементы управления-потомки не должны анализироваться никаким другим способом с помощью атрибута ParseChildren:

[ControlBuilderAttribute(typeof(StrawPollControlBuilder)) ]
[ ParseChildren(false) ]
public class StrawPoll : System.Web.UI.WebControls.WebControl, INamingContainer { }

Здесь используется класс с именем StrawPollControlBuilder, определенный следующим образом:

internal class StrawPollControlBuilder : ControlBuilder {
 public override Type GetChildControlType(string tagName, IDictionary attribs) {
  if (tagName.ToLower().EndsWith("option")) return typeof(Option);
  return null;
 }
 public override void AppendLiteralString(string s) {
  // ничего не делать, чтобы избежать добавления встроенного текста
  // к элементу управления
 }
}

Здесь мы переопределяем метод GetChildControlType() базового класса ControlBuilder чтобы он возвращал тип класса Option в ответ на тег с именем <Option>. Фактически, чтобы все работало в максимальном количестве ситуаций, мы ищем любое имя тега, которое оканчивается строкой "option" с буквами в верхнем или нижнем регистре.

Мы переопределяем также метод AppendLiteralString() так, чтобы любой промежуточный текст, включая пробелы, игнорировался и не вызывал никаких проблем.

Когда это сделано в предположении, что в StrawPoll нет никаких других элементов управления, мы будем иметь все элементы управления Option содержащимися в коллекции Controls из StrawPoll. Эта коллекция не будет содержать никаких других элементов управления.

Отметим, что построитель элементов управления использует коллекцию атрибутов. Чтобы использовать это добавим следующую инструкцию using в пространство имен:

using System.Collections;

Оглавление книги


Генерация: 1.427. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз