动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > ASP.NET技巧
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ ASP.NET技巧 ]的信息

本月文章推荐
.利用WebClient获取远程数据(仅做.
.利用OpenSmtp.Net发送需要smtp验.
.asp.net开发常用技巧收集.
.ASP.net组件编程中的两种事件编写.
.datagrid与DataSet结合使用中出现.
.使用PagedDataSource类实现DataL.
.ASPX接收WINDOWS应用程序以POST方.
.如何在webform.aspx.cs中控制用户.
.数据绑定控件再ASP.NET1.X和ASP..
.ASP.NET 2.0: 页面中链入的CSS、.
.asp.net技术的学习顺序问题.
.Web应用程序ASP.NET开发电子商务.
.ASP.NET MasterPage 中图片路径的.
.编写高性能Web应用程序的10个技巧.
.让ASP.NET简便使用SCRIPT.
.ConnectString中enlist设置的含义.
.asp.net中一次更新DATAGRID中所有.
.ASP.NET 2.0 中使用自定义缓存依.
.asp.net(C#)海量数据表高效率分页.
.ASP.NET访问Oracle数据库的方法.

Asp.net Ajax 1.0 异步回调时,服务器端Render原理

发表日期:2007-4-26 |


首冼回顾一下
Page页的生命周期

PreInit
Init
InitComplete
LoadState
ProcessPostData
PreLoad
Load
LoadComplete
PreRender      
PrepareCallback //如果有回调
PreRenderComplete
SaveState
SaveStateComplete
Render

不论是Asp.net请求,还是Ajax请求,都要执行上面的页生命周期,

在Page页最后会调用Page.RenderControl()呈现Page所有子控件

流程如下

Page.RenderControl
      Control.RenderControl()
             Control.RenderControl(writer,this.Adapter)
                   Control.RenderControlInternal()
                       Control.Render()   //此时Page.Render()将其重写
                            Control.RenderChildren()
                                  Control.RenderControlInternal()

现在关键所在
Control.RenderControlInternal()实现如下
如果不是Asp.net Ajax处理,肯定会执行foreach依次对所有的子控件进行遍历

 internal void RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
 {           
    //正常情况如果不设置RareFields,进行默认的流程依次对所有子控件进行处理,           
    //如果设置RareFields,意思就是以自定义的方式改写RenderChildren           
    if ((this.RareFields != null) && (this.RareFields.RenderMethod != null))     //当您SetRenderMethodDelegate时,RareFieldsEnsured就有值啦           
    {               
        writer.BeginRender();          
    
        //调用RenderMethod委托,Asp.net Ajax1.0在使用Control.SetRenderMethodDelegate时,对应的回调函数就是在此时处理的               
        this.RareFields.RenderMethod(writer, this);               
        writer.EndRender();           
    }           
    else if (children != null)           
    {                
        //如果不设置这个RareFieldsEnsured,会把Page里所有的控件呈现               
        //依次调用Control里所有子控件的RenderControl               
        foreach (Control control in children)               
        {                   
           control.RenderControl(writer);               
        }            
    }
       
}

以上是Asp.net 的Render处理
肯定有人要问上面的if是干吗的,这个可是微软流的接口呀,整个asp.net ajax全靠这个接口进行处理

在Asp.netAjax1.0上,你肯定要放一个ScriptManager吧
它也是Control的子类,
在Page生命周期的OnPreRender时,它会调用

PageRequestManager.OnPreRender();      


问题就在这,PageRequestManager.OnPreRender()实现如下

_owner.IPage.SetRenderMethodDelegate(RenderPageCallback);

SetRenderMethodDelegate()方法是干什么用的

在Control中,当您调用了SetRenderMethodDelegate会给Control.RareFieldsEnsured设置值
   public void SetRenderMethodDelegate(RenderMethod renderMethod)
        {
            //使用OccasionalFields.RareField
            this.RareFieldsEnsured.RenderMethod = renderMethod;
            this.Controls.SetCollectionReadOnly("Collection_readonly_Codeblocks");
        }

到这一切就清晰了,当您设置了RenderPageCallback,正常的Asp.net流程就不会再走了,所有的子控件就不会被Render
在Asp.netAjax 1.0中使用

private void RenderPageCallback(HtmlTextWriter writer, Control pageControl)
{          
     ...
    //取出当前的HtmlForm
    IHtmlForm formControl = _owner.IPage.Form;  
            
    //手动设置当FormControl.RenderControl时()回调方法  ,因为这个时候Page.Controls里有子控件不会被Render啦,怎么办           
    //手动处理一个呗             
    formControl.SetRenderMethodDelegate(RenderFormCallback);
           
    //同样,HtmlForm.RenderControl不会在Page.Controls里自动触发的
    //这个时候您需要手动的RenderCtronl一下,这样才能调用RenderFormCallback           
    formControl.RenderControl(formWriter); 
           
    //生成客户端回调信息|asyncPostBackControlIDs
    EncodeString(writer, AsyncPostBackControlIDsToken, String.Empty, GetAsyncPostBackControlIDs(false));           
    //生成客户端回调信息 |postBackControlIDs
    EncodeString(writer, PostBackControlIDsToken, String.Empty, GetPostBackControlIDs(false));           
    //生成客户端回调信息 |updatePanelIDs|tUpdatePanel         
    EncodeString(writer, UpdatePanelIDsToken, String.Empty, GetAllUpdatePanelIDs());    
    //生成客户端回调信息 |childUpdatePanelIDs     
    EncodeString(writer, ChildUpdatePanelIDsToken, String.Empty, GetChildUpdatePanelIDs());           
    //生成客户端回调信息 |panelsToRefreshIDs
    EncodeString(writer, UpdatePanelsToRefreshToken, String.Empty, GetRefreshingUpdatePanelIDs());           
    //生成客户端回调信息 |asyncPostBackTimeout           
    EncodeString(writer, AsyncPostBackTimeoutToken, String.Empty, _owner.AsyncPostBackTimeout.ToString(CultureInfo.InvariantCulture));
          
........
       
}
       
private void RenderFormCallback(HtmlTextWriter writer, Control containerControl)        
{         
   ....          
    //呈现所有的UpdatePanel           
    if (_updatePanelsToRefresh != null)            
    {               
        foreach (UpdatePanel panel in _updatePanelsToRefresh)                
        {                  
            if (panel.Visible)                   
            {                
                panel.RenderControl(_updatePanelWriter);        
                //    会生成如何的客户端回调信息    
                //169|updatePanel|UpdatePanel1|\r\n              
            }               
         }
           
    }     
     ...                  
    //依次将页面上所有控件的RenderControl,写入dummyWriter                   
    foreach (Control control in containerControl.Controls)                    
    {                       
         control.RenderControl(dummyWriter);  
         //生成一部分信息
         <input type=\"submit\" name=\"Button1\" value=\"Button\" id=\"Button1\" />\r\n              
         <input name=\"txt\" type=\"text\" value=\"wxy\" id=\"txt\" />\r\n                 
    }       

    注意,在RenderFormCallback时,HttpRequest会手动的Flush()将上面的信息刷加IIS
}

至于Ctronl.Render时,是如何写入HtmlTextWriter,再写入HttpWriter,
再写回HttpWorkRequest,最终刷回内核,或使用socket发送回服务器,不在本文讨论范围.......


由上可见,Asp.net Ajax,必没有使用传统的HttpRequest.Filter来处理回发信息,而是使用了Asp.net 2.0内置的方式和回调的


Asp.net Ajax回调后呈现到客户端有二个部分,一部分是由RenderFormCallback生成的如下

  RenderFormCallback部分会生成如下的客户端脚本        
 169|updatePanel|UpdatePanel1|\r\n  
 
<input type=\"submit\" name=\"Button1\" value=\"Button\" id=\"Button1\" />\r\n              
 <input name=\"txt\" type=\"text\" value=\"wxy\" id=\"txt\" />\r\n  

一部分是RenderPageCallback生成的

 52|hiddenField
|__VIEWSTATE|/wEPDwUJNjg1NjA3NDcxZGRCX32AH2I/NEq+gCFrVr49kQDECw==|56
|hiddenField|__EVENTVALIDATION|/wEWAwKf344xAoznisYGApKGsMIJOfjKisKPYP0O2NXUpNjnA29hMlA=|0
|asyncPostBackControlIDs|||0|postBackControlIDs|||13|updatePanelIDs||tUpdatePanel1|0
|childUpdatePanelIDs|||12|panelsToRefreshIDs||UpdatePanel1|2|asyncPostBackTimeout||90|12
|formAction||Default.aspx|13|pageTitle||Untitled Page|


在客户端的部分Sys.WebForm._onFormSubmitCompleted()会对所有的信息以Json type:type,id:id,content:content进行封装
取出UpdatePanel,设置其innerhtml,客户端详细部分见赵老大的blogs
http://www.cnblogs.com/liuxu-wxy/archive/2007/04/25/727346.html

上一篇:ASP.NET--制作功能完善的安装程序 人气:3739
下一篇:彻底放弃IIS让Apache也支持ASP.NET 人气:3251
浏览全部Asp.net Ajax 1.0的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-9-4 LPLY CMS 网站管理系统 v5.0
2008-9-4 缤纷互动视频交友 v3.01.902
2008-9-4 ADN视频收藏专家 v3.0 bulid 080
2008-9-4 天空网络电影系统SKYUC v2.5.6 简
2008-9-4 Web Wiz Rich Text Editor(文本编
2008-9-4 幻影动漫网视频系统(Ppdong) v1.
2008-9-4 乐维电脑在线DIY配置系统
2008-9-4 老樊文章管理系统SQL版
2008-9-4 ASP.NET 2.53 缩略图水印组件源码
2008-8-23 Mini WinMount V0.4
2008-8-23 Vista优化大师3.11正式版
2008-8-23 Wine 1.13
2008-8-23 KlipFolio 5.0 Build 5899-80
2008-8-23 Windows Sysinternals Desktops
2008-8-23 OneTap Movies1.2破解版
2008-8-23 AnnotaterPDF阅读1.1.503 破解版
2008-8-23 SoundMeter分贝测量仪 v1.0汉化破
2008-8-23 iDrum音乐节拍1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | Html转换js | js/vbs加密 | md5加密 | 进制转换
实用工具:汉字翻译拼音 | 符号对照表 | 个税计算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵