Asp.net Ajax 1.0 异步回调时,服务器端Render原理 2
点击次数:21 次 发布日期:2008-11-26 11:08:54 作者:源代码网
|
源代码网推荐 { 源代码网推荐 ... 源代码网推荐 //取出当前的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| 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 } 源代码网推荐 ... 源代码网推荐 //依次将页面上所有控件的RenderControl,写入dummyWriter 源代码网推荐 foreach (Control control in containerControl.Controls) 源代码网推荐 { 源代码网推荐 control.RenderControl(dummyWriter); 源代码网推荐 //生成一部分信息 源代码网推荐 <input type="submit" name="Button1" value="Button" id="Button1" /> 源代码网推荐 <input name="txt" type="text" value="wxy" id="txt" /> 源代码网推荐 } 源代码网推荐 源代码网推荐 注意,在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| 源代码网推荐 源代码网推荐 <input type="submit" name="Button1" value="Button" id="Button1" /> 源代码网推荐 <input name="txt" type="text" value="wxy" id="txt" /> 源代码网推荐 源代码网推荐 一部分是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 源代码网推荐 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
