国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

Asp.net Ajax 1.0 異步回調(diào)時(shí),服務(wù)器端Render原理

2019-11-18 16:34:34
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

首冼回顧一下
Page頁(yè)的生命周期

PReInit
Init
InitComplete
LoadState
ProcessPostData
PreLoad
Load
LoadComplete
PreRender      
PrepareCallback //如果有回調(diào)
PreRenderComplete
SaveState
SaveStateComplete
Render

不論是asp.net請(qǐng)求,還是Ajax請(qǐng)求,都要執(zhí)行上面的頁(yè)生命周期,

在Page頁(yè)最后會(huì)調(diào)用Page.RenderControl()呈現(xiàn)Page所有子控件

流程如下

Page.RenderControl
      Control.RenderControl()
             Control.RenderControl(writer,this.Adapter)
                   Control.RenderControlInternal()
                       Control.Render()   //此時(shí)Page.Render()將其重寫(xiě)
                            Control.RenderChildren()
                                  Control.RenderControlInternal()

現(xiàn)在關(guān)鍵所在
Control.RenderControlInternal()實(shí)現(xiàn)如下
如果不是Asp.net Ajax處理,肯定會(huì)執(zhí)行foreach依次對(duì)所有的子控件進(jìn)行遍歷

 internal void RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
 {           
    //正常情況如果不設(shè)置RareFields,進(jìn)行默認(rèn)的流程依次對(duì)所有子控件進(jìn)行處理,           
    //如果設(shè)置RareFields,意思就是以自定義的方式改寫(xiě)RenderChildren           
    if ((this.RareFields != null) && (this.RareFields.RenderMethod != null))     //當(dāng)您SetRenderMethodDelegate時(shí),RareFieldsEnsured就有值啦           
    {               
        writer.BeginRender();          
    
        //調(diào)用RenderMethod委托,Asp.net Ajax1.0在使用Control.SetRenderMethodDelegate時(shí),對(duì)應(yīng)的回調(diào)函數(shù)就是在此時(shí)處理的               
        this.RareFields.RenderMethod(writer, this);               
        writer.EndRender();           
    }           
    else if (children != null)           
    {                
        //如果不設(shè)置這個(gè)RareFieldsEnsured,會(huì)把Page里所有的控件呈現(xiàn)               
        //依次調(diào)用Control里所有子控件的RenderControl               
        foreach (Control control in children)               
        {                   
           control.RenderControl(writer);               
        }            
    }
       
}

以上是Asp.net 的Render處理
肯定有人要問(wèn)上面的if是干嗎的,這個(gè)可是微軟流的接口呀,整個(gè)asp.net ajax全靠這個(gè)接口進(jìn)行處理

在Asp.netAjax1.0上,你肯定要放一個(gè)ScriptManager吧
它也是Control的子類,
在Page生命周期的OnPreRender時(shí),它會(huì)調(diào)用

PageRequestManager.OnPreRender();      


問(wèn)題就在這,PageRequestManager.OnPreRender()實(shí)現(xiàn)如下

_owner.IPage.SetRenderMethodDelegate(RenderPageCallback);

SetRenderMethodDelegate()方法是干什么用的

在Control中,當(dāng)您調(diào)用了SetRenderMethodDelegate會(huì)給Control.RareFieldsEnsured設(shè)置值
   public void SetRenderMethodDelegate(RenderMethod renderMethod)
        {
            //使用OccasionalFields.RareField
            this.RareFieldsEnsured.RenderMethod = renderMethod;
            this.Controls.SetCollectionReadOnly("Collection_readonly_Codeblocks");
        }

到這一切就清晰了,當(dāng)您設(shè)置了RenderPageCallback,正常的Asp.net流程就不會(huì)再走了,所有的子控件就不會(huì)被Render
在Asp.netAjax 1.0中使用

private void RenderPageCallback(HtmlTextWriter writer, Control pageControl)
{          
     ...
    //取出當(dāng)前的HtmlForm
    IHtmlForm formControl = _owner.IPage.Form;  
            
    //手動(dòng)設(shè)置當(dāng)FormControl.RenderControl時(shí)()回調(diào)方法  ,因?yàn)檫@個(gè)時(shí)候Page.Controls里有子控件不會(huì)被Render啦,怎么辦           
    //手動(dòng)處理一個(gè)唄             
    formControl.SetRenderMethodDelegate(RenderFormCallback);
           
    //同樣,HtmlForm.RenderControl不會(huì)在Page.Controls里自動(dòng)觸發(fā)的
    //這個(gè)時(shí)候您需要手動(dòng)的RenderCtronl一下,這樣才能調(diào)用RenderFormCallback           
    formControl.RenderControl(formWriter); 
           
    //生成客戶端回調(diào)信息|asyncPostBackControlIDs
    EncodeString(writer, AsyncPostBackControlIDsToken, String.Empty, GetAsyncPostBackControlIDs(false));           
    //生成客戶端回調(diào)信息 |postBackControlIDs
    EncodeString(writer, PostBackControlIDsToken, String.Empty, GetPostBackControlIDs(false));           
    //生成客戶端回調(diào)信息 |updatePanelIDs|tUpdatePanel         
    EncodeString(writer, UpdatePanelIDsToken, String.Empty, GetAllUpdatePanelIDs());    
    //生成客戶端回調(diào)信息 |childUpdatePanelIDs     
    EncodeString(writer, ChildUpdatePanelIDsToken, String.Empty, GetChildUpdatePanelIDs());           
    //生成客戶端回調(diào)信息 |panelsToRefreshIDs
    EncodeString(writer, UpdatePanelsToRefreshToken, String.Empty, GetRefreshingUpdatePanelIDs());           
    //生成客戶端回調(diào)信息 |asyncPostBackTimeout           
    EncodeString(writer, AsyncPostBackTimeoutToken, String.Empty, _owner.AsyncPostBackTimeout.ToString(CultureInfo.InvariantCulture));
          
........
       
}
       
private void RenderFormCallback(HtmlTextWriter writer, Control containerControl)        
{         
   ....          
    //呈現(xiàn)所有的UpdatePanel           
    if (_updatePanelsToRefresh != null)            
    {               
        foreach (UpdatePanel panel in _updatePanelsToRefresh)                
        {                  
            if (panel.Visible)                   
            {                
                panel.RenderControl(_updatePanelWriter);        
                //    會(huì)生成如何的客戶端回調(diào)信息    
                //169|updatePanel|UpdatePanel1|/r/n              
            }               
         }
           
    }     
     ...                  
    //依次將頁(yè)面上所有控件的RenderControl,寫(xiě)入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時(shí),HttpRequest會(huì)手動(dòng)的Flush()將上面的信息刷加IIS
}

至于Ctronl.Render時(shí),是如何寫(xiě)入HtmlTextWriter,再寫(xiě)入HttpWriter,
再寫(xiě)回HttpWorkRequest,最終刷回內(nèi)核,或使用socket發(fā)送回服務(wù)器,不在本文討論范圍.......


由上可見(jiàn),Asp.net Ajax,必沒(méi)有使用傳統(tǒng)的HttpRequest.Filter來(lái)處理回發(fā)信息,而是使用了Asp.net 2.0內(nèi)置的方式和回調(diào)的


Asp.net Ajax回調(diào)后呈現(xiàn)到客戶端有二個(gè)部分,一部分是由RenderFormCallback生成的如下

  RenderFormCallback部分會(huì)生成如下的客戶端腳本        
 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()會(huì)對(duì)所有的信息以Json type:type,id:id,content:content進(jìn)行封裝
取出UpdatePanel,設(shè)置其innerhtml,客戶端詳細(xì)部分見(jiàn)趙老大的blogs
http://www.survivalescaperooms.com/liuxu-wxy/archive/2007/04/25/727346.html


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 武隆县| 大庆市| 汝阳县| 青冈县| 莆田市| 安西县| 鄯善县| 丹阳市| 法库县| 湖南省| 上虞市| 五常市| 定陶县| 五家渠市| 南阳市| 寿阳县| 青龙| 贡山| 科尔| 攀枝花市| 册亨县| 都匀市| 涡阳县| 四子王旗| 汾西县| 阿克| 河北区| 崇州市| 曲麻莱县| 筠连县| 桓仁| 阳泉市| 正镶白旗| 汶川县| 康乐县| 肃北| 开封县| 武威市| 延川县| 威海市| 平乡县|