ASP.NET WebForms - Управление дизайном (по данным) - PullRequest
0 голосов
/ 28 марта 2011

Я занимаюсь проектированием / созданием веб-приложения ASP.NET среднего масштаба с использованием WebForms.Основная работа в проекте - создание каждой веб-формы, и я не знаю, как спроектировать (в смысле кода / данных / потока данных) мои элементы управления.

Я приведу несколько примеровс чем я имею дело, чтобы вы могли понять, что я имею в виду:


Распространенной задачей в приложении является ввод и отображение уличных адресов.Поэтому я создал UserControl под названием «AddressFields», который содержит серию элементов HtmlInputText (один для строки 1, другой для города / города, страны, почтового индекса и т. Д.).Мои классы сущностей БД содержат класс с именем «Address», поэтому этот элемент управления имеет методы:

  • void ShowAddress (Address addr) - который заполняет элементы HtmlInputText соответствующим текстом).
  • void UpdateAddress (Address addr) - обновляет содержимое addr в соответствии с текущим содержимым элементов HtmlInputText
  • Address CreateAddress () - создает новый экземпляр Address, затем передает его в UpdateAddress и затем возвращает его

Пока все хорошо.Это работает, потому что элемент управления AddressFields «тупой», все что он делает, это отображает и получает данные для пользователя.ViewState также напрямую управляется полями HtmlInputText, поэтому никакой дополнительной логики не требуется.


Другой объект в моем приложении - это «Клиент», который является классом с атрибутом Address, но этот класс также имеетнесколько более сложных аспектов.Например, у Клиента есть ряд тегов («категорий» в моем приложении), которые можно назначить.В этом случае я разработал подкласс элемента управления ASP.NET CheckboxList.

Я создал еще один UserControl под названием «ClientFields», который содержит все необходимые поля для отображения информации о клиенте (включая элемент управления AddressFields), но онтакже включает в себя мой подкласс CheckboxList под названием «CategoryList».

Проблема здесь заключается в том, что элемент управления CategoryList должен быть предоставлен для отображения данных (но не для обратных передач, поскольку он использует viewstate). В этом случае мой вопрос: кто несет ответственность за подключение к базе данных и получение списка категорий ?

Это элемент управления CategoryList?(Если так, то где в жизненном периоде элемента управления он запрашивает базу данных? Он не может сделать это в Control.Load, потому что это происходит после заполнения ClientFields. Это происходит в самом ClientFields? (Опять же, тогда где в продолжительности жизниэто происходит, потому что у ClientFields есть свой метод ShowClient (Client c), вызываемый в Page.Load. Альтернативой является раскрытие CategoryList из ClientFields, чтобы к нему можно было напрямую обращаться к странице, но это является нарушением хорошего дизайна программного обеспечения.

1 Ответ

1 голос
/ 28 марта 2011

По моему мнению, CategoryList отвечает за получение данных списка категорий, поскольку все данные категорий должны быть получены независимо от того, выбран ли один или несколько из них конкретным клиентом.

когда это происходитCategoryList запрашивает базу данных за время ее жизни?

Как правило, переопределите метод OnInit, чтобы заполнить CategoryList, но ViewState не начинает работать в это время, поэтому вам нужно извлечь данные из БД и заполнитьсам на каждом постбеке.Если вы хотите положиться на ViewState, определите и зарегистрируйте обработчик события InitComplete страницы Page в переопределенном методе OnInit и заполните CategoryList в обработчике события.И метод OnInit, и событие InitComplete вызываются / запускаются до события Load.

//In CategoryList control
protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    Page.InitComplete += new EventHandler(Page_InitComplete);
}

void Page_InitComplete(object sender, EventArgs e)
{
    // retrieve the data and populate the control
}

Надеюсь, это поможет

...