何时使用PreRender而不是PageLoad?

9

相关问题:获取页面上特定类型的所有Web控件

在上面的问题中,我问了如何获取所有控件,它工作得很好,但有些地方似乎不太对,所以我认为可能是我的问题。我有以下代码,但它没有操作页面上的控件,但在我的理论中应该可以工作。

List<DropDownList> allControls = new List<DropDownList>();
ControlEnhancer.GetControlList<DropDownList>(Page.Controls, allControls);

foreach (DropDownList childControl in allControls)
        {
            foreach (ListItem li in childControl.Items)
            {
                li.Attributes.Add("title", li.Text);
            }

            childControl.Attributes.Add("onmouseover", "this.title=this.options[this.selectedIndex].title");
        }

这是代码,可以从相关问题中获取GetControlList()代码,该代码展示了如何获取所有控件,我只是对其进行了操作。我试图获取所有下拉列表项并为它们添加标题,以便我可以有一个工具提示。

这是IE8及以下版本的快速修复程序,用于修复下拉框中过长的文本被截断的问题。


原始问题获取控件列表,而这个问题我需要获取下拉列表控件并像上面尝试的那样操纵它们,例如添加文本属性。 - Anicho
更新:似乎问题不在代码上,而是在位置上,直到我强制刷新页面后才执行它,问题完全不同,很快会发布答案。 - Anicho
在页面加载时运行它,需要在预渲染事件中运行它。 - Anicho
2个回答

9

事实上,有些情况下即使在 PreRender 事件中处理仍然太早了(例如,使用 DataSourceID 的控件在数据绑定期间可能会将 DropDownList 控件添加到控件树中)。

还有两个事件可能更为合适:

  • PreRenderComplete。此时,所有控件都已创建,页面已准备好进行呈现。

  • SaveStateComplete。在视图状态和控件状态保存后发生。在此处进行的任何更改都不会持久保存到视图状态。

对于您的示例(添加客户端属性),我会使用 SaveStateComplete 事件以避免不必要的视图状态膨胀。


感谢您积极改进答案。谢谢。 - Anicho

9
Page_Load经常发生得太早;而Page_PreRender是页面HTML实际呈现给浏览器的最后时刻,在许多情况下是设置用户控件属性的最佳位置。
这是因为在Web表单(页面)生命周期中,页面中还有其他事件(以及包含在页面中的用户控件...),有时会删除/替换/覆盖 (真的) 这些属性,所以您可以将这些属性附加到所有其他生命周期事件已被触发和处理之后,在Page_PreRender中将它们传递给浏览器。

2
我推荐每个人阅读这篇好答案:http://msdn.microsoft.com/en-us/library/ms178472.aspx,以更好地理解ASP.NET页面生命周期。 - Anicho
3
“Page_PreRender是页面HTML实际呈现前的最后时刻” - 这并不准确,还有之后的事件 PreRenderCompleteSaveStateComplete。请参考我的回答。 - Joe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接