亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Asp.net Ajax 1.0 異步回調時,服務器端Render原理

2019-11-18 16:34:34
字體:
來源:轉載
供稿:網友

首冼回顧一下
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.49028c.com/liuxu-wxy/archive/2007/04/25/727346.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲三级免费看| 中文字幕日韩在线观看| 国产区亚洲区欧美区| 欧美一级免费看| 久久精品电影网站| 成人免费视频网| 国产欧美中文字幕| 欧美成人黑人xx视频免费观看| 91爱爱小视频k| 欧日韩不卡在线视频| 日韩亚洲精品视频| 国产精品成人v| 久久综合久中文字幕青草| 欧美视频免费在线观看| 亚洲国产精品美女| 亚洲美女精品成人在线视频| 久久久久五月天| 欧美精品一区三区| 青青草一区二区| 久久成年人免费电影| 国产丝袜视频一区| 日韩av免费网站| 国产中文日韩欧美| 日韩经典中文字幕在线观看| 久久视频在线看| 久久97久久97精品免视看| 国产日韩欧美影视| 久久久免费观看| 亚洲xxx视频| 九九综合九九综合| 日本一本a高清免费不卡| 亚洲裸体xxxx| 在线激情影院一区| 欧美激情亚洲另类| 亚洲电影免费在线观看| 亚洲最新在线视频| 国产美女扒开尿口久久久| www.xxxx精品| 亚洲女人被黑人巨大进入al| 国产视频精品在线| 中文字幕久久久av一区| 91精品久久久久久久久久入口| 色综合久久久久久中文网| 国产一区红桃视频| 亚洲欧美综合另类中字| 国语自产精品视频在线看抢先版图片| www.国产精品一二区| 4438全国成人免费| 一区三区二区视频| 国产美女扒开尿口久久久| 91在线免费观看网站| 欧美精品在线播放| 日本精品性网站在线观看| 中文字幕日韩欧美| 亚洲精品国精品久久99热一| 精品国产一区二区三区四区在线观看| 国产精品白嫩初高中害羞小美女| 久久99久久99精品中文字幕| 日韩激情在线视频| 成人羞羞国产免费| 97视频在线观看免费| 久久精品成人欧美大片| 精品久久久国产精品999| 亚洲国产三级网| 成人亲热视频网站| 性色av一区二区三区免费| 66m—66摸成人免费视频| 精品国产一区二区三区久久狼5月| 日韩视频永久免费观看| 日本中文字幕不卡免费| 日本一区二区不卡| 91欧美精品午夜性色福利在线| 2019日本中文字幕| 国产日韩欧美综合| 伊人久久男人天堂| 国产99久久精品一区二区| 国产精品黄视频| 亚洲国产小视频| 福利精品视频在线| 国精产品一区一区三区有限在线| 国产91免费看片| 国产精品视频久| 欧美日韩在线视频一区二区| 欧美激情网友自拍| 色综合久久88色综合天天看泰| 国产精品免费观看在线| 国产mv免费观看入口亚洲| 日韩亚洲第一页| 狠狠躁天天躁日日躁欧美| 色婷婷久久一区二区| 色哟哟网站入口亚洲精品| 亚洲欧洲av一区二区| 国产亚洲a∨片在线观看| 国产精品免费视频xxxx| 日韩成人av在线| 国产在线视频不卡| 亚洲一区中文字幕在线观看| 久久久久国产精品www| 国产精品免费久久久| 国产一区二区三区三区在线观看| 精品国产自在精品国产浪潮| 2025国产精品视频| 欧美日韩中文字幕| 成人黄色av网站| 国产成人精品电影| 日韩动漫免费观看电视剧高清| 欧美性猛xxx| 成人免费福利视频| 国产精品∨欧美精品v日韩精品| 国产精品国产三级国产专播精品人| 日韩欧美中文免费| 国产精品中文久久久久久久| 亚洲国产精品电影在线观看| 国产91露脸中文字幕在线| 欧美自拍视频在线观看| 欧美丝袜第一区| 91网站在线看| 911国产网站尤物在线观看| 国产国语刺激对白av不卡| 欧美激情在线狂野欧美精品| 一区二区三区视频在线| 91日本在线观看| 亚洲国产精品女人久久久| 亚洲美女免费精品视频在线观看| 久久在线免费观看视频| 一个色综合导航| 亚洲第一在线视频| 久久电影一区二区| 国产精品热视频| 久久在线精品视频| 欧美老少配视频| 久久国内精品一国内精品| 亚洲欧美国内爽妇网| 中文国产成人精品久久一| 亚洲精品在线视频| 成人一区二区电影| 久久久精品999| 欧美极品美女视频网站在线观看免费| 日韩精品欧美国产精品忘忧草| xvideos亚洲人网站| 日本一区二区三区四区视频| 久久影院资源网| 国产91热爆ts人妖在线| 性色av一区二区三区红粉影视| 成人午夜在线视频一区| 国产91成人在在线播放| 欧美精品久久久久a| 性欧美长视频免费观看不卡| 亚洲国产精品va在线| 另类图片亚洲另类| 亚洲大胆人体视频| 51色欧美片视频在线观看| 亚洲最大福利网| 一区二区成人精品| 国产成人高潮免费观看精品| 在线丨暗呦小u女国产精品| 亚洲国产另类 国产精品国产免费| 国产精品九九久久久久久久| 国产欧美婷婷中文| 午夜精品在线观看| 久久久视频在线| 欧美专区在线播放| 日韩欧美国产免费播放| 国产欧美精品一区二区三区介绍|