• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

Dotnet之旅

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

OnPreRender Render的区别

protected override void OnPreRender(EventArgs e)
protected override void Render(HtmlTextWriter writer)
这两个的区别。可否告知

====================================================

asp.net页面在触发各个子控件的事件之后,会递归调用控件的OnpreRender,然后(注意)递归地将控件的ViewState序列化成一个字符串,最后递归调用控件的Render输出结果(在最高层控件即page控件的Render就会把那个ViewState序列化字符串写到输出的html的隐藏字段中)。

因此,在Render中创建、改变的内容即使写入ViewState,其实也无法在页面回发之后被恢复,叶面回发之后回填的ViewState仍然是OnPreder或者之前的时候得值。

因此通常,控件的OnPrerender用来最控件的最后最后一次改变(动态生成),而在Render中仅仅用来输出html而并不改变控件自身。
 
另外,控件在vs设计器中的时候,并不是page对象驱动页面显示的。虽然在设计其上看上去很像asp.net应用程序处理页面的结果。起码,设计器并不调用OnPrerender,而是根据Designer标签中说明的方法来调用显示逻辑。这样你就可以让控件在设计器中表现为与运行时不同的结果。例如表格控件在设计器中就不显示所有绑定数据,而是显示自己创建的一组示例数据,以便让你有一个简洁的方式设计界面布局,同时也让连接数据库等等只有在运行时才需要的费时、可能失败的行为在设计时避免执行。

这里我想到一个常见现象。很多人已经会写自定义控件了。但是其实只了解运行时的控制机制,写出的自定义控件并不支持vs设计器的控制机制。例如这个OnPreRender在设计时并不被调用是很多人不知道的。精通编写自定义控件的人,也许仅仅让其以程序代码的方式被使用,其编写的自定义控件使用在RAD方式的时候并不好用,这是常见的。
 
 

posted on 2006-11-07 09:31  浮游  阅读(766)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3