有一个空页面,运行时动态从配置文件中装载用户控件(.ascx)。配置文件:<xml ...>
<UserControl>
<Name>Header.ascx</Name>
</UserControl>
<UserControl>
<Name>Login.ascx</Name>
</UserControl>
<UserControl>
<Name>News.ascx</Name>
</UserControl>
<UserControl>
<Name>Footer.ascx</Name>
</UserControl>
......
页面运行时:
Page_Load(object sender, EventAge e)
{
DataSet ds = new DataSet(); ds.ReadXml("配置文件"); foreach(DataRow dr in ds.Tables[0].Rows)
{
this.Form1.LoadControl(dr["Name"].ToString());
}
}---------------------------------这样的性能肯定有问题,请大虾们各抒己见,如何提高性能,谢谢!!注:以上代码是故意简化的。只是描述清楚我的问题。
<UserControl>
<Name>Header.ascx</Name>
</UserControl>
<UserControl>
<Name>Login.ascx</Name>
</UserControl>
<UserControl>
<Name>News.ascx</Name>
</UserControl>
<UserControl>
<Name>Footer.ascx</Name>
</UserControl>
......
页面运行时:
Page_Load(object sender, EventAge e)
{
DataSet ds = new DataSet(); ds.ReadXml("配置文件"); foreach(DataRow dr in ds.Tables[0].Rows)
{
this.Form1.LoadControl(dr["Name"].ToString());
}
}---------------------------------这样的性能肯定有问题,请大虾们各抒己见,如何提高性能,谢谢!!注:以上代码是故意简化的。只是描述清楚我的问题。
解决方案 »
- Excel导出问题,Excel默认加上"20"??????????
- asp.net dataset写到excel文件中要引用什么dll?
- asp.net用语法向数据库中新建属性列且插入数据异常
- MEMBERSHIP权限问题 虚拟主机解决方案!
- 关于静态类与实例类占内存的问题~
- 无法调试ASP.NET程序的问题!!!
- VS2008打开或创建ASP.NET网站或程序时候,会自动关闭。求助。
- 取得服务器上的时间?
- 一个很才的问题,在asp.net中,用vb.net语言,怎么实现弹出消息框,messagebox可以使用马?
- 如何在多个.net website服务端之间调用彼此的方法呢?
- 怎么把Excel显示到Web页面上,老问题了,还是没有解决?
- javascript如何调用后台c#类
或者是路径指错了。
protected void Page_Init(object sender, EventArgs e)
{
Control ctrl = Page.LoadControl("~/UserControls/MyUC1.ascx");
uc1 = (UserControls_MyUC1)ctrl; PlaceHolder1.Controls.Add(uc1);
}我发现在Page_Load里加载好像也没什么区另啊。那么:
For an added control to participate in postback data processing, including validation, the control must be added in the Init event rather than in the Load event. 这句话应该怎么理解?
而放在 OnLoad 中,因为没有使用 if (!isPostBack) 而每次回传都要加载一次?
对 CPU 的占用比较高。请大家继续啊。
通常之所以“动态加载”,往往是因为要根据页面状态来决定加载的具体Ascx。而写死的方式,那种 Control ctrl = Page.LoadControl("~/UserControls/MyUC1.ascx");
uc1 = (UserControls_MyUC1)ctrl;
PlaceHolder1.Controls.Add(uc1);
其实没有什么实用意义,只能作为一种语法演示而已,完全可以在设计器上把ascx拖入,而无需“写死”代码。真正使用时,往往是: object content=ViewState["cont"];
if(content!=null)
{
Control ctrl = Page.LoadControl((string)content);
ctrl.ID="cont";
PlaceHolder1.Controls.Add(ctrl);
}而且,你所举得的这段代码缺少“要命的”ID属性设置,多余进行类型转换,实在看不出专业应用的痕迹。MSDN中如果有这一段,实在是一个外行写的这一段。
别说什么放在 Init 中,就算是你在设计器上设计的aspx页面中写死的控件,例如随便放一个 TextBox 控件,回发时也是重新加载的。只不过它是在 Init 之前。包括你通过鼠标拖动到设计器上的ascx,也是动态加载的。唯一只是它不是你自己写代码手动加载,而是asp.net编译时生成了那段代码。如果说你手动加载控件会明显降低效率,只能是写错了代码,写出多余执行很多无用操作的代码。
我看过专门介绍这个问题的,但实在是没能理解。
好像书上的意思是,页面第一次加载,会经历n个页面事件;然后回发时,就只会有(n-1)个页面事件;而这剪掉的1个事件就是init事件。
仅仅是“好像”!!!
我后来试过一段时间,不得要领,只得做罢了。
进行类型转换是为了访问ascx里自定义属性,这种情况还是有的吗?=====================
再说了,难道没发现
Control ctrl = Page.LoadControl("~/UserControls/MyUC1.ascx");
uc1 = (UserControls_MyUC1)ctrl;
PlaceHolder1.Controls.Add(uc1);
它会自定赋ID给动态加载的控件吗?总的来讲,为什么sp1234认为实际上不会有动态加载ascx的需要?就比如根据情况加载或不加载?
既然是动态加载ascx,那么无论是在Init,还是Load里加载,都必须在每次的回发中加载一次。这是肯定的。
主要的问题是在Load里加载时,那是在页面Page Life-cyle的Load ViewState过程结束以后。
那么,按技术文档里说话这是不“正规”的作法。我仅仅是这方面没想通而已。而不觉得动态加载控件有什么问题。加载时机问题,原理没搞清楚。这才是问题。
第一次访问或者后续的Postback,总是会执行Init是吧?这又不是winform,没有什么放在Init就能防止二次绑定的问题。放在Init,还是Load里,涉及到的是ViewState的问题。这里着实让人想不太明白。
我知道放在Init是为了在LoadViewState之前加载动态控件,也就是说进入Load ViewState这个过程之前把页面的控件树建立好。为什么呢?好像是这里涉及到的页面管理子控件的view state的细节问题。
1.如果你的xml文件很大,读取xml文件及查找某个节点必须要花时间2.foreach(DataRow dr in ds.Tables[0].Rows) 不知你的ds.Tables[0]有多少row,当然如果你的站点访问的用户不多这个可以忽略的.
即使你在Page_load事件处理程序中加入控件,asp.net也可以管理好它的viewstate。一种动态控件,是在页面已经进入LoadViewState过程之中,通过FindControl方法(查找控件内部的子控件)调用了EnsureChildControl从而调用了CreateChildControls方法,调用了你写在override的CreateChildControls方法内的代码装入子控件。它的状态数据和Post数据会随后、在页面的page_load开始之前填入。另一种动态控件,就是在page_load中创建控件并放入父控件的Controls集合,它的状态数据和Post数据会在Page_Load完成之后才填入。也就是说asp.net会两次为考虑ViewState才动态创建的子控件处理状态和值,以及记录应该触发的事件。为什么考虑ViewState才动态创建子控件?因为asp.net本来就是支持一个交互设计的嘛。页面上用户应该交互地干很多事,界面变化很多次,然后当用户觉得满意了、可以离开这个页面了,才把一些状态数据提交到数据库里。
虽然还是不太明白,不过我看的肯定是1.1的技术文档。
听你这么一说感觉舒服多了。我突然想到,好多人为什么说asp.net简单呢?简单吗?还是我想得太复杂了。
同感,sp1234、xhtmldivcss 说出了微软对 ASP.NET 的设计理念,让简单应用的人觉得简单无比,而高级应用如“自定义出非常完善的面向特定应用的界面组件”绝不是那么简单的,ASP.NET 的内部构造是一个复杂而庞大的工程啊。
1 哪里加载都还是要加载的。包扩 PostBack 时也是要重新加载的。 加载是不能避免的。
2 xml 的读取肯定是要缓存和进行一些处理的。
3 页面缓存、静态页面方法。
(1) 静态页面不需讨论了,这个肯定是行得通的。-- 当 xml 变化后,第一次访问动态页面时,生成静态页面。以后访问静态页面。
(2) 页面缓存也是要考虑的。
-------------大虾们还有没有其他见解呢,欢迎继续讨论。谢谢.
不知道该讨论很么?
是啊,这里并不是讨论生成 html.是讨论动态加载控件,能否有提升性能的空间。