我在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文件中嵌入每个具体类中的公共标记)。
我很感激有关正确定义此类控件的方法的任何建议。
为伪代码道歉 - 我现在正在做这个概念的证明。
谢谢, 丰富。
答案 0 :(得分:0)
为避免布局问题,您可以创建模板化ASP.NET用户控件。这是来自MSDN的example
答案 1 :(得分:0)
我建议创建一个函数来生成基类中的标记,子类可以调用它们传递它们想要呈现的数据类型/模板(这甚至可以是ascx文件的路径)/函数在模板中呈现(子)数据(再次在子类中)。
答案 2 :(得分:0)
我认为您无法直接使用用户控件执行此操作。你可以做的是将其分解为2个控件,一个用户控件和一个常规服务器控件。将标记保留在用户控件中,让服务器控件覆盖OnInit方法并加载用户控件并将其添加为子级。所有带抽象方法的逻辑都可以嵌入到可以继承的服务器控件中。