为什么动态添加的控件信息不见了?
今天遇到一个老问题,原来解决过的现在又忘记了,汗啊。
问题是这样的,我在一个table里面动态添加了n个textbox,然后客户端输入内容之后,我在服务器端就出现了这2个问题。
1. 取到的动态载入textbox的内容为"",因为我每次page load都动态加载那些textbox了,所以每次取得的都是新添加的textbox的""。
2. 如果加入if(!IsPostBack)那么那些textbox根本就不存在了!
原因是我对asp.net的页面模型又模糊了(强烈自我批评)。查看msdn的这段话:
页面生存周期中的第一个阶段是初始化。这一阶段的标志就是 Init 事件,在成功创建页面的控件树后,对应用程序激发这个事件。换而言之,当 Init 事件发生时,在 .aspx 源文件中静态声明的所有控件都已实例化并取其默认值。控件可挂起 Init 事件,以便初始化在传入的 Web 请求的生存周期中所需的任何设置。例如,此时控件可以加载外部模板文件或设置各个事件的处理程序。应该注意到,这时还没有视图状态信息可供使用。在初始化之后,页面框架立即加载该页面的视图状态。
我才恍然大悟,原来应该在init的时候就应该动态添加那些内容(textbox),这样在下一个阶段载入视图状态的时候,就可以将那些textbox的内容用viewstate来填充了。否则如果那些动态添加的内容放在page load的里面,当载入视图状态的时候那些控件(textbox)还不存在呢!所以内容也就不见了!
问题是这样的,我在一个table里面动态添加了n个textbox,然后客户端输入内容之后,我在服务器端就出现了这2个问题。
1. 取到的动态载入textbox的内容为"",因为我每次page load都动态加载那些textbox了,所以每次取得的都是新添加的textbox的""。
2. 如果加入if(!IsPostBack)那么那些textbox根本就不存在了!
原因是我对asp.net的页面模型又模糊了(强烈自我批评)。查看msdn的这段话:
页面生存周期中的第一个阶段是初始化。这一阶段的标志就是 Init 事件,在成功创建页面的控件树后,对应用程序激发这个事件。换而言之,当 Init 事件发生时,在 .aspx 源文件中静态声明的所有控件都已实例化并取其默认值。控件可挂起 Init 事件,以便初始化在传入的 Web 请求的生存周期中所需的任何设置。例如,此时控件可以加载外部模板文件或设置各个事件的处理程序。应该注意到,这时还没有视图状态信息可供使用。在初始化之后,页面框架立即加载该页面的视图状态。
页面初始化 |
Init |
|
加载视图状态 |
LoadViewState | |
处理回发数据 |
实现 IPostBackDataHandler 接口的任何控件中的 LoadPostData 方法 | |
加载页面 |
Load |
我才恍然大悟,原来应该在init的时候就应该动态添加那些内容(textbox),这样在下一个阶段载入视图状态的时候,就可以将那些textbox的内容用viewstate来填充了。否则如果那些动态添加的内容放在page load的里面,当载入视图状态的时候那些控件(textbox)还不存在呢!所以内容也就不见了!