【发布时间】:2011-02-18 10:58:27
【问题描述】:
我正在开发一个问卷类型的应用程序,其中问题存储在数据库中。因此,我在每个 Page.OnLoad 上动态创建控件。 这就像一个魅力,并且 ViewState 在回发之间保持不变,因为我确保我的动态控件始终具有相同的生成 Control.ID。
除了动态填充问题的用户控件外,我的调查问卷页面还包含一个“状态”部分(也由用户控件封装),它表示调查问卷的状态(选项为“完成”、“已开始”或“进行中”)。如果用户更改调查问卷的状态(即从“进行中”变为“完成”),我需要回发到服务器,因为调查问卷的动态部分的内容取决于所选状态。
无论状态如何,某些问题始终存在,而对于所选状态,其他问题可能根本不存在。关键是,当状态发生变化时,我必须回发到页面并呈现正确的问题集。此外,我需要为那些“始终可用”的问题保留任何用户输入的值。
但是,由于 ASP.NET 中的页面生命周期,“状态”用户控件的 OnLoad 包含从数据库加载正确问题所需的正确状态,直到在“动态问题”之后才会执行' 用户控件已被填充(使用错误/过时的值)。
为了解决这个问题,我从我的“状态”用户控件向主页提出了一个事件,以指示状态已更改。然后主页会在“动态问题”用户控件上引发一个事件。因为当这个事件冒泡时,“动态问题”用户控件已经从数据库中加载了“错误”问题,它首先调用 Controls.Clear。然后它愉快地使用新状态来查询数据库中的“正确”问题,并对每个问题执行 Control.Add()。仅供参考,Control.ID 在回发中是一致的。
这个解决方案有效......有点。确实会呈现所选状态的正确问题集;然而,ViewState 正在为那些“始终可用”的问题而迷失。我猜这是因为“动态问题”用户控件在响应状态更改事件时调用 Controls.Clear。这必须以某种方式终止 ViewState 和我的动态控件之间的关联,即使 Control.ID 是一致的。
这似乎是一个常见的要求,我几乎可以肯定有一种更好、更清晰、更不容易出错的方法来实现这一点。万一它不是很明显,尽管去年使用它,我仍然无法理解 ASP.NET 页面的生命周期。非常感谢任何帮助!
【问题讨论】:
-
我曾经遇到过这个问题,但我一直没有弄清楚。我最终完全改变了我解决整个问题的方式。我想我把它做成了一个多页的过程,我从来没有对它感到满意。祝你好运。我希望这个问题能得到一个好的答案。
-
因此,您呈现状态为 A 的页面。然后用户更改为状态 B 并发生回发。在此回发期间,您在加载期间以“错误”状态重新创建动态控件?你说哪个状态是错误的?在页面加载期间,状态应该是 B,这是正确的。这是你看到的吗?
标签: asp.net dynamic events viewstate page-lifecycle