我正试着用我的头脑去理解asp.net。我有一个长期的php开发者的背景,但我现在面临着学习asp.net的任务,我在这方面遇到了一些麻烦。这很可能是因为我试图强迫框架做一些它不想做的事情--所以我想学习如何“以正确的方式”去做。:-)
我的问题是如何在运行时以编程方式向页面添加控件。据我所知,您需要在page_init中创建控件,否则它们会在下一个PostBack中消失。但很多时候,我会遇到这样的问题:我不知道在page_init中添加哪些控件,因为它依赖于以前PostBack中的值。
一个简单的方案可以是在设计器中添加下拉控件的窗体。下拉列表设置为AutoPostBack。当PostBack发生时,我需要呈现一个或多个依赖于从下拉控件中选择的值的控件,并且最好让这些控件的行为就像它们是由设计添加的一样(就像“当回发时,行为”正确“)。
我走错路了吗?
发布于 2008-09-22 06:23:52
您必须在OnInit事件内添加控件,视图状态将被保留。不要使用if(ispostback),因为每次都必须添加控件,回发中的事件!
(反)视图状态的序列化发生在OnInit之后和OnLoad之前,因此如果在OnInit中添加控件,视图状态持久性提供者将看到动态添加的控件。
但在您描述的场景中,可能多视图或简单的隐藏/显示(可见属性)将是更好的解决方案。
这是因为在OnInit事件中,当你必须读取dropdown并添加新控件时,视图状态还没有被读取(反序列化),并且你不知道用户选择了什么!(你可以做request.form(),但感觉有点不对)
发布于 2008-09-30 08:07:14
在与这个问题搏斗了一段时间后,我提出了这些基本规则,这似乎是可行的,但YMMV。
如果必须在事件处理程序中使用添加控件,请使用Aydsman的提示并在重写的LoadViewState.中重新创建控件,请使用
TRULY Understanding ViewState是一本必读的书。
Understanding Dynamic Controls By Example展示了一些关于如何使用数据绑定而不是动态控件的技术。
TRULY Understanding Dynamic Controls还澄清了可用于避免动态控件的技术。
希望这对其他有同样问题的人有所帮助。
发布于 2008-09-22 06:46:47
如果您确实需要使用动态控件,则应执行以下操作:
重新添加那些你不需要的、在OnLoad中无论如何都会被移除的“陈旧”控件似乎有点奇怪,但Asp.Net在设计时并没有真正考虑到动态控件的创建。如果在viewstate加载过程中没有保留完全相同的控件层次结构,那么页面中就会潜伏着各种难以找到的bug,因为旧控件的状态会被加载到新添加的控件中。
阅读Asp.Net页面的生命周期,尤其是视图状态是如何工作的,它将变得清晰。
编辑:这是一篇很好的文章,介绍了视图状态的行为,以及在处理动态控件时应该考虑的问题:http://geekswithblogs.net/FrostRed/archive/2007/02/17/106547.aspx
https://stackoverflow.com/questions/113392
复制相似问题