【发布时间】:2010-09-01 22:07:58
【问题描述】:
情况:
破碎的解决方案 A:
- Page_Load:动态创建Add按钮,hook点击事件。
- 用户点击添加按钮,触发回发。
- Page_Load:像往常一样创建添加按钮,并挂钩点击事件。
- Page_Load:不知道 Add 按钮已被点击,因此它不知道生成用户控件!
- AddButton_Click:页面终于意识到应该在下一个 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 并在单击“添加”按钮后强制页面手动重新加载,这是对带宽和处理的浪费。
【问题讨论】:
-
您的“添加”按钮需要使用 Javascript 或 jQuery 完成其神奇的客户端。服务器端代码在这里不起作用,除非您打算在每次点击“添加”按钮时往返(即发布)页面。
-
目前,每次点击按钮都发布一次,这还不是世界末日。问题是,由于它们的生命周期,我最好的解决方案是让它 POST 两次。如果这是我能做的最好的,那是 ASP.NET 规划中的一个相当大的缺陷,这让我很难过。
标签: asp.net events controls page-lifecycle pageload