很明顯的,ScriptManager 和 UpdatePanel 是ASP.NET AJAX中最重要的2個類。
用Reflector查看Microsoft.Web.Extensions.dll 裡的類時,發現有很多個介面,譬如象IHtmlForm,IHttpBrowserCapabilities,IHttpCachePolicy,IHttpContext,IHttpRequest,IHttpResponse,IPage等,封裝了System.Web裡對應類的某些方法,還有對應的一些Wrapper類,譬如HtmlFormWrapper ,HttpBrowserCapabilitiesWrapper,HttpCachePolicyWrapper,HttpContextWrapper,HttpRequestWrapper,HttpResponseWrapper,PageWrapper等,使用System.Web裡對應類的對象實現了上面這些介面的方法。看上去,下一個版本ASP.NET將會有很多重構!
仔細看了一下 ScriptManager 類的實現,發現很多一些功能都被抽象出來, 封裝在 PageRequestManager 類(用戶端有一個同名的類)裡。
頁面起始的GET大概的流程如下:
局部更新的POSTBACK大概的流程如下:
其中 PageRequestManager 類在 IsAsyncPostBackRequest() 方法中通過分析 Headers 中“Pragma”的值是否是 “Deltea=true” 來決定是否是局部更新模式。然後在執行 ScriptManager 的 LoadPostData() 中找出哪個 UpdatePanel 需要更新以及是由哪個元素造成的 PostBack,記住在前面說過,在局部更新時,類似”ScriptManager1=UpdatePanel1|btnUpdate&....“ 這樣的資料被提交到伺服器端了。然後在執行 ScriptManager 的 OnPreRender() 時,PageRequestManager 類調用了 Page 類的 SetRenderMethodDelegate(),通過設定一個 RenderMethod,實際上 PageRequestManager 類接管了顯示輸出的邏輯。