LoadControl相关,高手请进。
习惯上人们在编写网页时,往往都是几个相同的模块组合的,比如一个主页“页首”、“菜单”、“导栏”、“主客户区”、“页尾”等组成。在同一个网站内的网页往往都有相同的组成风格,而只是“主客户区”的内容不同。为此,我作出了一个假设,如果“主客户区”用PlaceHolder作为容器,用同一个Load.aspx网页来动态加载主客户区的内容(ascx控件),则大在的简化了编程,用不着每个aspx文件都在加载“页头”,“菜单”...,另外一个方面的原因就是出于安全性的考虑,有时为了不想让别人知道当前页的地址,而把当前页做ascx文件的来插到调用的网页上。于时,就用于动态加载控件的函数LoadControl,这样,当用户点击界面上的linkbutton时,在onclick事件中动态加载ascx控件到“主客户区”的容器PlaceHolder中。但是,在实现中,出现了些问题:
1、由于用Codebehind="Load.cs",所以容器PlaceHolder只能在Load.cs中出现,假如Load.aspx中调用了其他的xxx1.ascx控件,xxx1.ascx中有一个linkbutton1和还调用了xxx2.ascx控件,在xxx2.ascx中有一个linkbutton2。这时在与之邦定的xxx1.cs和xxx2.cs中无法找到load.aspx中的容器PlaceHolder来加载所需要的控件。我想过用Cache["PlaceHolder"]的方法在Load.cs的OnLoad事件中记录。然后再从xxx1.cs中用((PlaceHolder)(Cache["PlaceHolder"])).LoadControl("my1.ascx")。这样虽然可行,但是我希望有人提出比我更好的方案。
2、LoadControl要每次post时都要使用感觉很不方便,意思说是:假如我点了xxx1.ascx上的linkbutton而在Load.aspx的容器PlaceHolder中加载了控件my.ascx,而在xxx2.ascx中也有一个linkbutton2,但没置onclick,当点击linkbutton2时,容器原来的控件my1.ascx消失了,这正是我所不希望的。我考虑过在onLoad事件中加载,但在网页中任何linkbutton触发时,都会引发整个网页内所有ascx控件的onload事件,这样每次onload时都加载,效率也许很低。希望大家能提个好方法。