asp.net中,维护动态加载控件的类实现 的想法

在asp.net的程序设计中,个人认为,动态加载控件,维护其状态,是一件非常麻烦的事情,不仅需要在页面的特定处理阶段去创建这个控件,还需要在每次页面加载的时候,重新创建这个控件,并且指定其事件处理程序等等。这个维护工作量非常大,如果一个页面上有多个控件是动态创建的话。

同样的事情,在C/S结构的程序设计中,就变得非常简单,我们只需要一次创建,那么控件就永远会在那个地方,除非显示删除它。

为什么会这样,原因就在于c/s和b/s的架构不同,c/s是一次创建界面,而b/s结构是多次创建。b/s结构基于非持续连接的网络,因此她需要维护每一次交互的状态,根据这些状态信息来创建界面。虽然在asp.net中,相当大一部分工作已经被隐藏起来,并且已经做的很好了,但是在动态控件这一块,我觉得仍然需要有改进的地方。

来看看传统上我们是怎样处理处理动态控件的

Private button_clicked(….)

{

//…. Do something

Button btn = new Button();

PlaceHolder1.Controls.Add(btn);

Btn.Click += ….;

Btn.Text = “…”

ViewStatue[“btnCreated”] = true; //设置控件被创建标志

// …

}

然后在页面的Page_Load事件中还要

Page_Load(…)

{

If (ViewStatue[“btnCreated”] != null)

{

Button btn = new Button();

// 重复button_clicked事件里的步骤

}

}

可能仅仅一两个同类的控件还没什么,但是如果碰上需要动态创建很多不同种类控件,控件的地点又分布在页面的各个地方,那么这件事就会变得非常复杂和难以把握。初步

个人觉得,维护动态创建的控件的状态,完全可以由Page的基类来实现,由这个类完成对动态加载控件的监控,并在页面重新载入的适当时候,创建控件,并加入到合适的地方,使得开发人员感觉控件的创建是一次性的,不需要每次页面载入的时候都要重新创建。

这个基类实现的初步想法如下

Public class PersistanceDynamicControl : System.Web.UI.Page

{

// 存放动态创建的控件信息列表,当然这里仅仅是演示,实际应用中应该会用到ViewState来保存这张列表

Object [] dynamicControlsList ;

// 用来在页面上加入动态创建的控件

// 此函数为实现的核心部分,它可以利用反射将建立的动态控件的状态信息读取(包括位置信息),并保存,以便在下一此页面建立的时候创建这些控件。

Public AddControl(Control parentControl, Control dynamicControl)

//该函数用来根据保存动态控件列表,创建控件,并将它们放入合适地点,该函数可以在OnInit函数中被调用

Private CreateDynamicControls()

Public override OnInit()

{

CreateDynamicControls();

}

//索引器,返回动态创建控件的引用

Object DynamicControls[string ControlName]

}

然后,创建的页面只需要继承这个基类,用AddControl()函数来加入动态创建的控件,用 (ClassType)base.DynamicControls[“ClassName”]的方式得到动态创建的控件的引用。动态控件一旦加入到页面上,便一直可以访问,不管page post back多少次。这样,就和c/s结构有点类似了。

这只是自己的一个不成熟的想法,目前还没有实现,欢迎大家批评。