情况:
破碎的解决方案A:
- Page_Load:动态创建一个Add按钮,hook点击事件。
- 用户点击添加按钮,触发回发。
- Page_Load:像往常一样创建添加按钮,并挂钩单击事件。
- Page_Load:不知道 Add 按钮已经被点击,所以它不知道生成用户控件!
- AddButton_Click:Page 终于意识到应该在下一个 Page_Load 时添加一个新的用户控件。
- 用户看不到他们添加的控件,因为另一个 Page_Load 已被触发。
- 用户通过单击按钮、刷新页面等方式重新加载页面。
- Page_Load:创建添加按钮,并挂钩单击事件。现在知道添加的用户控件,创建用户控件。挂钩用户控件中的事件。
- 用户点击用户控件中的按钮,触发就好了。
结果:用户已单击添加新用户控件,服务器知道该控件应该存在,但用户在触发页面再次加载(通过单击另一个按钮或刷新等)之前看不到它。
当然,我查看了生命周期,发现 Page_LoadComplete 发生在事件之后,所以如果我在 Page_LoadComplete 中放置任何与事件相关的代码,应该一切都好吗?
破碎的解决方案 B:
- Page_LoadComplete:动态创建一个Add按钮,hook点击事件。
- 用户点击添加按钮,触发回发。
- Page_LoadComplete:像往常一样创建添加按钮,并挂钩单击事件。
- AddButton_Click:页面意识到应该在下一个 Page_LoadComplete 时添加一个新的用户控件。
- Page_LoadComplete:感知按钮点击,动态添加控件,自带内部按钮点击事件。
- 用户单击添加的用户控件中的按钮,但没有触发!
结果:一切都很好,除了添加的用户控件中的按钮是惰性的。
难题是:我需要通过单击按钮生成控件,这意味着我需要将Controls.Add(...)
代码放入 Page_LoadComplete 中。相反,我需要添加的控件具有工作事件,这意味着Controls.Add(...)
代码需要在 Page_Load 中。我有一个完美的二分法。
我能想到的唯一 janky 解决方案是采用解决方案 A 并在单击 Add 按钮后强制页面手动重新加载,这是对带宽和处理的浪费。