抽象ASP.NET用户控件,而不重新创建标记

本文关键字:新创建 创建 NET ASP 用户 控件 抽象 | 更新日期: 2023-09-27 18:24:58

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

伪标记

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

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

示例用法:通过添加按钮将列表框项目从列表框1添加到列表框2(也有用于添加所有项目和从选定项目到可用项目的其他按钮-为了清楚起见,这些按钮未显示),然后该项目将从列表框中删除并放在列表框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之类的函数,我必须将AvailableList Box控件(以及所有其他控件)从具体类传递到基类中。此外,对于每个具体类,标记都必须重复(我想我可以将公共标记从另一个.ascx文件嵌入到每个具体类中)。

如果能就如何正确界定这种管制提出任何建议,我将不胜感激。

为伪代码道歉——我现在这样做是为了证明概念。

谢谢,富有的

抽象ASP.NET用户控件,而不重新创建标记

我认为您不能用用户控件直接做到这一点。您可以将其分解为2个控件,一个用户控件和一个常规服务器控件。将标记保留在用户控件中,并让服务器控件覆盖OnInit方法,加载用户控件并将其作为子控件添加。所有具有抽象方法的逻辑都可以嵌入到可以继承的服务器控件中。

为了避免布局问题,可以创建Templated ASP.NET User控件。下面是MSDN 的一个示例

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