这边有一个页面,用的是几个 asp.net 的用户控件,其中用户控件使用了缓存。用户控件中有自定义属性,比如项目查询的控件,可以显示已完成的项目或者未完成的项目,配置这个属性即可。
现在遇到这么一个问题,我新建两个控件,对这两个控件单独 new ,赋属性,加入缓存,控件的内容正确,并且刷新之后内容仍然正确。
但是如果放到循环里,即把控件的路径和参数提取到数组中,并且在数组中循环新建控件,赋属性,加入缓存,在页面第一次加载是正确的,但之后刷新的时候就会都变成最后面的控件内容。
有大大能解释一下这个原理么或者给个解决方案么?
(不能在循环里加载缓存控件完全没办法提取成配置文件,这样这边设计就需要修改了)
下面是一个实例程序,直接F5运行即可,刷新一下页面就能看到效果。
下面是一些主要代码,有思路及时回答哦,小弟拜谢。
string[] cont = new string[] { "WebUserControl1.ascx", "WebUserControl1.ascx" }; int[] tempSeconds = new int[] {20,60 }; string[] param = new string[] { "循环第一次", "循环第二次"}; for (int i = 0; i < 2; ++i) { cc = LoadControl(cont[i]); SetCacheTime(cc, tempSeconds[i]); lap.Controls.Add(cc); pcc = cc as PartialCachingControl; if (pcc.CachedControl != null) { WebUserControl1 paracc1 = (WebUserControl1)pcc.CachedControl; // 说明:这个para1 用来赋值给usercontrol1的一个textbox // 首次载入的时候第一个是循环第一次,第二个是循环第二次 // 但刷新页面后第一个和第二个都变成了循环第二次。 // 但是如果不写成循环,而是代码分别写, // 不管刷新几次都是循环第一次和循环第二次 paracc1.para1 = param[i]; } }
你可以看下你用 for 时,lap.Controls.Add 的两个控件其实是同一个,注意 pcc.CacheControl 的 ClientID.
好像是这样的,但是还是没头绪怎么处理啊,除了LoadControl有其他的办法能载入控件么?...
@C:\WILLIN: 不知道,不会 Asp.Net
@Launcher: 哦... 不过仍然谢谢,之前确实没注意它根本就是一个控件。