ASP.NET-强制子/容器事件在父onload之前触发?

Han*_*ber 7 asp.net viewstate events page-lifecycle dynamic

我正在研究一种问卷类型的应用程序,其中问题存储在数据库中.因此,我在每个Page.OnLoad上动态创建我的控件.这就像一个魅力,并且在回发之间保持ViewState,因为我确保我的动态控件始终具有相同的生成Control.ID.

除了动态填充问题的用户控件之外,我的问卷页面还包含一个"状态"部分(也由用户控件封装),表示问卷的状态(选项为"完成","已启动"或"在进展').如果用户更改问卷状态(即从"进行中"更改为"完成"),我需要回发到服务器,因为问卷的动态部分的内容取决于所选状态.

无论状态如何,一些问题始终存在,而其他问题可能根本不存在于所选状态.关键是,当状态发生变化时,我必须回发到页面并呈现正确的问题集.此外,我需要为那些"始终可用"的问题保留任何用户输入的值.

但是,由于ASP.NET中的页面生命周期,"状态"用户控件的OnLoad(包含从DB加载正确问题所需的正确状态)在"动态问题"用户控件之后才会执行已填充(错误/陈旧值).

为了解决这个问题,我将一个事件从我的"状态"用户控件引发到主页面,以指示状态已更改.然后主页面在"动态问题"用户控件上引发一个事件.因为当这个事件冒出来时,"动态问题"用户控件已经从DB加载了"错误"的问题,它首先调用Controls.Clear.然后,它愉快地使用新状态来查询数据库中的"正确"问题,并在每个问题上执行Control.Add().仅供参考,Control.ID在回发中保持一致.

这个解决方案有效......分类.确定了所选状态的正确问题集; 然而,ViewState因为"永远可用"的问题而迷失了方向.我猜这是因为"动态问题"用户控件在响应状态更改事件时调用Controls.Clear.这必须以某种方式杀死ViewState和我的动态控件之间的关联,即使Control.ID是一致的.

这似乎是一个常见的要求,我几乎可以肯定,有一个更好,更清洁,更不容易出错的方法来实现这一目标.如果它不明显,尽管在去年使用它,我还是无法理解ASP.NET页面的生命周期.任何帮助深表感谢!

Jef*_*nal 2

但是,由于 ASP.NET 中的页面生命周期,“状态”用户控件的 OnLoad(包含从数据库加载正确问题所需的正确状态)直到“动态问题”用户控件之后才会执行已经填充(使用错误/陈旧的值)。

如果您知道底层状态控件的客户端 ID,则可以通过绕过 Web 表单并直接访问发布的表单数据,在页面生命周期的任何时刻获取发布的值:

// where 'selectedStatus' is the id of the html <input> control the user clicks
string statusString = Request.Form["selectedStatus"];
Run Code Online (Sandbox Code Playgroud)