RSS 2.0 Feed
ASP.NET/AJAX
摘要:很明显的,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 类接管了显示输出的逻辑。 ...[阅读全文]

posted @ | Feedback (0) |

摘要:查看一下用ASP.NET AJAX-Enabled Web Site模板生成的网站文件里面的web.config,其中的pages部是这样的, <pages><controls><add tagPrefix="asp" namespace="Microsoft.Web.UI" assembly="Microsoft.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/><add tagPrefix="asp" namespace="Microsoft.Web.UI.Controls" assembly="Microsoft.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/></controls><tagMapping><add tagType="System.Web.UI.WebControls.CompareValidator" mappedTagType="Microsoft.Web.UI.Compatibility.CompareValidator, Microsoft.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/><add tagType="System.Web.UI.WebControls.CustomValidator" mappedTagType="Microsoft.Web.UI.Compatibility.CustomValidator, Microsoft.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/><add tagType="System.Web.UI.WebControls.RangeValidator" mappedTagType="Microsoft.Web.UI.Compatibility.RangeValidator, Microsoft.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/><add tagType="System.Web.UI.WebControls.RegularExpressionValidator" mappedTagType="Microsoft.Web.UI.Compatibility.RegularExpressionValidator, Microsoft.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/><add tagType="System.Web.UI.WebControls.RequiredFieldValidator" mappedTagType="Microsoft.Web.UI.Compatibility.RequiredFieldValidator, Microsoft.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/><add tagType="System.Web.UI.WebControls.ValidationSummary" mappedTagType="Microsoft.Web.UI.Compatibility.ValidationSummary, Microsoft.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/></tagMapping></pages> 前面一部分把Microsoft.Web.Extensions里的控件的前缀设成asp,后面一部分则替换了原有的验证控件。 httpHandlers/httpModules部是这样的, <httpHandlers><remove verb="*" path="*.asmx"/><add verb="*" path="*.asmx" validate="false" type="Microsoft.Web.Script.Services.ScriptHandlerFactory, Microsoft.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/></httpHandlers><httpModules><add name="WebResourceCompression" type="Microsoft.Web.Handlers.WebResourceCompressionModule, Microsoft.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/><add name="ScriptModule" type="Microsoft.Web.UI.ScriptModule, Microsoft.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/></httpModules> 前面一部分换掉了处理Web服务(*.asmx)的引擎,后面则在处理管道里添加 webresource.axd 资源压缩和脚本模块。脚本模块处理了3个事件, protected virtual void Init(HttpApplication context){context.PreSendRequestHeaders += new EventHandler(this.PreSendRequestHeadersHandler);context.PostAcquireRequestState += new EventHandler(this.OnPostAcquireRequestState);context.AuthenticateRequest += new EventHandler(this.AuthenticateRequestHandler);} 对PreSendRequestHeaders事件,处理重新定向,把重新定向的地址写到回复数据里 private void PreSendRequestHeadersHandler(object sender,......[阅读全文]

posted @ | Feedback (1) |

摘要:看一下前面那个帖子里的HTML,在加载页面时,有这2行编码 <script type="text/javascript">Sys.WebForms.PageRequestManager._initialize('ScriptManager1', document.getElementById('form1'));Sys.WebForms.PageRequestManager.getInstance()._updateControls(['tUpdatePanel1'], [], [], 90);</script> 看一下MicrosoftAjaxWebForms.js里Sys.WebForms.PageRequestManager._initialize的定义, Sys.WebForms.PageRequestManager._initialize = function Sys$WebForms$PageRequestManager$_initialize(scriptManagerID, formElement) {if (Sys.WebForms.PageRequestManager.getInstance()) {throw Error.invalidOperation(Sys.WebForms.Res.PRM_CannotRegisterTwice);}Sys.WebForms.PageRequestManager._instance = new Sys.WebForms.PageRequestManager();Sys.WebForms.PageRequestManager.getInstance()._initializeInternal(scriptManagerID, formElement);} 生成了一个Sys.WebForms.PageRequestManager对象实例,然后调用了该实例的_initializeInternal方法(实际方法名为 Sys$WebForms$PageRequestManager$_initializeInternal),在该方法中, function Sys$WebForms$PageRequestManager$_initializeInternal(scriptManagerID, formElement) {this._scriptManagerID = scriptManagerID; this._form = formElement; this._form._initialAction = this._form.action; this._onsubmit = this._form.onsubmit;this._form.onsubmit = null;this._onFormSubmitHandler = Function.createDelegate(this, this._onFormSubmit);this._onFormElementClickHandler = Function.createDelegate(this, this._onFormElementClick);this._onWindowUnloadHandler = Function.createDelegate(this, this._onWindowUnload);Sys.UI.DomEvent.addHandler(this._form, 'submit', this._onFormSubmitHandler);Sys.UI.DomEvent.addHandler(this._form, 'click', this._onFormElementClickHandler);Sys.UI.DomEvent.addHandler(window, 'unload', this._onWindowUnloadHandler); this._originalDoPostBack = window.__doPostBack;if (this._originalDoPostBack) {window.__doPostBack = Function.createDelegate(this, this._doPostBack);} this._pageLoadedHandler = Function.createDelegate(this, this._pageLoadedInitialLoad);Sys.UI.DomEvent.addHandler(window, 'load', this._pageLoadedHandler);} 保存了单个ScriptManager的ID,对几个事件添加了处理函数,其中比较重要的是 Sys.UI.DomEvent.addHandler(this._form, 'submit', this._onFormSubmitHandler);Sys.UI.DomEvent.addHandler(this._form, 'click', this._onFormElementClickHandler); 而上面的 Sys.WebForms.PageRequestManager.getInstance()._updateControls(['tUpdatePanel1'], [], [], 90); 则保存了一系列的UpdatePanel的ID,可能造成PostBack的控件ID,以及异步PostBack过期时间(这里设置了90秒),参考MicrosoftAjaxWebForms.js里 的Sys$WebForms$PageRequestManager$_updateControls()函数。 在点击按钮后,上面的click事件会触发,导致Sys$WebForms$PageRequestManager$_onFormElementClick()的执行。在其中会设置_postBackSettings,如果你仔细研究一下_getPostBackSettings(),你会发现,它会将按钮的ID与它所在的UpdatePanel的ID通过“|”连接在一起。然后设置一些其他的输入参数,将来会在提交时传回服务器。 因为我们的按钮是个<input type="submit">,导致_onFormSubmit(), 即Sys$WebForms$PageRequestManager$_onFormSubmit()的执行,这是PostBack的关键函数。 function Sys$WebForms$PageRequestManager$_onFormSubmit(evt) { 这部分是检查客户端脚本的验证或验证控件是否合法 var continueSubmit = true; if (this._onsubmit) {continueSubmit = this._onsubmit();} if......[阅读全文]

posted @ | Feedback (2) |

摘要:使用了HttpWatch,对同一个ASPX文件在2个版本下的HTML内容做了一下观察。 所用的ASPX文件:(在ASP.NET 2.0 AJAX Beta 1中,你需要将 "atlas:" 改成 "asp:") <%@ Page Language="C#" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><script runat="server">void Page_Load(Object sender, EventArgs e){if (!IsPostBack)lblDateTime.Text = DateTime.Now.ToString();} void UpdateDateTime(Object sender, EventArgs e){lblDateTime.Text = DateTime.Now.ToString();}</script><html xmlns="http://www.w3.org/1999/xhtml" ><head runat="server"><title>Hello World Testing....</title></head><body><h2><%= DateTime.Now %></h2><form id="form1" runat="server"><atlas:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="true"/><div><atlas:UpdatePanel ID="UpdatePanel1" runat="server"><ContentTemplate><asp:Button ID="btnUpdate" runat="server" Text="Show Date Time" OnClick="UpdateDateTime"/>:<br /><asp:Label ID="lblDateTime" runat="server" /></ContentTemplate> </atlas:UpdatePanel></div></form></body></html>   Atlas 7月份 CTP ASP.NET 2.0 AJAX Beta 1 初始GET HTTP/1.1 200 OKServer: ASP.NET Development Server/8.0.0.0Date: Wed, 25 Oct 2006 16:52:31 GMTX-AspNet-Version: 2.0.50727Cache-Control: privateContent-Type: text/html; charset=utf-8Content-Length: 1629Connection: Close <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" ><head><title>Hello World Testing....</title><style type="text/css">.atlas__delta { font-family:Lucida Console; }......[阅读全文]

posted @ | Feedback (2) |