Абстрактный ASP.NET User Control без воссоздания разметки - PullRequest
1 голос
/ 16 февраля 2012

У меня есть следующий макет элемента управления, реплицированный несколько раз в приложении ASP.NET, и я хотел бы инкапсулировать функциональность в пользовательский элемент управления (или серверный или составной элемент управления, если необходимо).

PSEUDO MARKUP

LISTBOX1 (Доступные объекты)> (кнопка Добавить) LISTBOX2 (Выбранные объекты)

В основном 2 списка с доступными объектами в одном списке и выбранными объектами в другом списке (тип этих объектов будет меняться в зависимости отиспользуйте, например, коллекцию доступных и выбранных продуктов)

Пример использования: добавьте элемент списка из списка1 в список2 с помощью кнопки добавления (есть также кнопки для добавления всех и перехода из выбранного в доступное положение - этине показаны для ясности), и элемент удаляется из списка1 и помещается в список2.Довольно просто - я назову элемент управления DualListbox.

Я хотел бы сделать это:

DualListbox.ascx содержит разметку, подобную этой:

<asp:ListBox id="AvailableListBox"  runat="server"/> 
<asp:Button  id="AddItemtoSelected" runat="server"/> 
<asp:ListBox id="SelectedListBox"   runat="server"/>

и DualListBox.ascx.cs содержит ряд абстрактных и неабстрактных функций, свойств и т. д.

например,

--We don't actually use CollectionBase but a class derived from it
protected abstract CollectionBase AvailableItems {get;set;}
protected abstract CollectionBase SelectedItems  {get;set;}


protected abstract void SaveContentsofAvailableListBox ();

private void FillAvailableListBox ()
{
   .....
   AvailableListBox.DataSource = AvailableItems;
   AvailableListBox.DataBind()
}
private void MoveItemfromAvailabletoSelectedListBox()
{
   ..Some code that takes item from available and puts it in selected.
}

Тогда я бы унаследовал от DualListbox.ascx, например,

ConcreteDualListBox : DualListBox
{
    public override WidgetCollection AvailableItems {get;set;}
    public override void SaveContentsofAvailableListBox(){}; etc.etc.
}

Проблема в том, что вы не можете наследовать разметку, и поэтому разметка в DualListBox недоступна для конкретного класса.Я могу определить разметку в конкретном классе, но затем использовать функции, такие как FillAvailableListBox, в базовом классе. Мне нужно было бы передать элемент управления AvailableListBox (и все другие элементы управления) в базовый класс из конкретного класса.Также для каждого конкретного класса разметка должна была бы повторяться (я мог бы встроить общую разметку в каждый конкретный класс из другого файла .ascx, я полагаю).

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

Извинения за псевдокод - на данный момент я делаю это как подтверждение концепции.

Спасибо, Рич.

Ответы [ 3 ]

0 голосов
/ 16 февраля 2012

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

0 голосов
/ 16 февраля 2012

Я не думаю, что вы можете сделать это напрямую с помощью пользовательского элемента управления.Что вы можете сделать, это разбить это на 2 элемента управления, пользовательский элемент управления и обычный серверный элемент управления.Сохраните разметку в пользовательском элементе управления, и серверный элемент управления переопределит метод OnInit, загрузит пользовательский элемент управления и добавит его как дочерний элемент.Вся логика с абстрактными методами может быть встроена в серверный элемент управления, который может быть унаследован.

0 голосов
/ 16 февраля 2012

Чтобы избежать проблем с макетом, вы можете создать Templated ASP.NET User control.Вот пример от MSDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...