手机站
网通分站
电信主站
密 码:
用户名:
热门关键字:  虚拟主机  cn域名  asd  域名注册  域名
当前位置 : 主页>网络编程>Asp.Net编程>列表

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

来源:互联网 作者:west263.com 时间:2008-02-22 点击:
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

首冼回顾一下
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)

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

共2页: 上一页 1 [2] 下一页
最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名
注册