抽象的ASP.NET用户控件,无需重新创建标记

时间:2012-02-15 22:37:06

标签: c# asp.net user-controls markup abstract

我在ASP.NET应用程序中多次复制了以下控件布局,并希望将功能封装在用户控件(或服务器或复合控件,如果需要)中。

PSEUDO MARKUP

LISTBOX1(可用对象)> (添加按钮)LISTBOX2(选定对象)

基本上有2个列表框,其中一个列表框中有可用对象,另一个列表框中有选定对象(这些对象的类型将根据用途而变化,例如可用和选定产品的集合)

示例用法:通过添加按钮将listbox1中的列表框项添加到listbox2(还有用于添加所有内容的按钮以及从选择到可用的另一种方式 - 为清晰起见未显示这些内容)并且该项目已从listbox1并放在listbox2中。相当简单 - 我将控件称为DualListbox。

我想这样做:

DualListbox.ascx包含如下标记:

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

和DualListBox.ascx.cs包含一系列抽象和非抽象函数,属性等。

e.g

--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 :(得分:0)

为避免布局问题,您可以创建模板化ASP.NET用户控件。这是来自MSDN的example

答案 1 :(得分:0)

我建议创建一个函数来生成基类中的标记,子类可以调用它们传递它们想要呈现的数据类型/模板(这甚至可以是ascx文件的路径)/函数在模板中呈现(子)数据(再次在子类中)。

答案 2 :(得分:0)

我认为您无法直接使用用户控件执行此操作。你可以做的是将其分解为2个控件,一个用户控件和一个常规服务器控件。将标记保留在用户控件中,让服务器控件覆盖OnInit方法并加载用户控件并将其添加为子级。所有带抽象方法的逻辑都可以嵌入到可以继承的服务器控件中。