什么时候使用PreRender而不是PageLoad?

Ani*_*cho 9 .net c# asp.net drop-down-menu

相关问题:获取页面上特定类型的所有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");
        }
Run Code Online (Sandbox Code Playgroud)

这是代码,GetControlList()代码,你可以从相关的问题中获得,它显示了它如何获得所有控件,它只是我的操作.我正在尝试获取所有下拉列表列表项并为它们添加标题,以便我可以获得工具提示.

它是IE8的快速修复程序,下面是下拉框中的长文本剪切.

Dav*_*ras 9

Page_Load经常发生太快; Page_PreRender是为浏览器实际呈现页面的HTML之前的最后一刻,在许多情况下,这是在用户控件上设置属性的最佳位置.

这是因为在Web表单(页面)生命周期中,页面中有其他事件(以及页面中包含的用户控件...),有时会删除/替换/覆盖(真正)这些属性,所以这是唯一的方法获取这些属性到浏览器是在所有其他生命周期事件被触发和处理之后追加它们Page_PreRender.

  • "Page_PreRender是实际呈现页面HTML之前的最后一刻" - 不是真的,后来发生了事件`PreRenderComplete`和`SaveStateComplete`.看我的回答. (3认同)
  • 很好的答案我建议大家阅读:http://msdn.microsoft.com/en-us/library/ms178472.aspx以更好地了解asp.net页面生命周期. (2认同)

Joe*_*Joe 9

实际上,PreRender在某些情况下甚至可能为时过早(例如DropDownList,在使用的控件的数据绑定期间,您可以将控件添加到控件树中DataSourceID).

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

  • PreRenderComplete.此时,将创建所有控件并准备好呈现页面.

  • SaveStateComplete.保存视图状态和控制状态后发生.您在此处所做的任何更改都不会保留为查看状态.

在您的示例中(添加客户端属性),我将使用该SaveStateComplete事件来避免不必要的视图状态膨胀.