MagicAjax中最重要的文件就是MagicAjaxModule.cs。这个文件中的MagicAjaxModule类实现了IHttpModule接口并实现了它的Init方法。它拦截了Http请求,并进行了复杂的处理。这个处理主要是三个步骤:Application_BeginRequest,Application_AcquireRequestState和Application_EndRequest。在Application_BeginRequest中它保存了当前HttpContext对象的HttpRequest和HttpResponse,这个对以后的输出有重要的作用。
Application_AcquireRequestState的处理是最主要的。首先它判断这是否是一个aspx请求,如果不是的话就直接返回。这里也对请求是“get”的页面直接输出。接下来它会判断这是不是一个ajax请求。如果是的话,它就会调用下面的语句
还有一句比较重要:
当然,MagicAjax有三种不同的页面存储,我这里用的是NoStore,其它两种以后在探:)
到了这句执行结束,其实返回的是整个页面的代码,但页面要实现无刷新更新就只需要变动部分的代码,那这是怎么变出来的呢?答案就在Application_EndRequest这个处理中。首先我们看到前面保存的_request对象发挥了它的作用:
只要这是个ajax请求,我们就获得ViewState中的内容并输出到客户端:
最后,下面的语句:
正是整个函数的调用,将整个页面的代码转换成变动部分的JS代码。AjaxCallHelper这个类本身就负责输出的。我们可以看它的这个End函数的内容:
我们可以看到,HttpResponse对象在将输出到客户端时被替换掉了,最后输出的是sbWritingLevels中的一个StringBuilder的文本。这里输出还牵涉到一个脚本等级(估摸应该是这个意思),这个偶还不是很清楚,看来要查点资料了,不知道是不是脚本输出的优先级问题?
这里就是MagicAjax的主要过程,可能其中有不少问题和错误,还请大家不吝指教拉!
_request = context.Request;
_response = context.Response;
_response = context.Response;
Application_AcquireRequestState的处理是最主要的。首先它判断这是否是一个aspx请求,如果不是的话就直接返回。这里也对请求是“get”的页面直接输出。接下来它会判断这是不是一个ajax请求。如果是的话,它就会调用下面的语句
HttpContext.Current.Handler.ProcessRequest(HttpContext.Current);
还有一句比较重要:
_response.End();
当然,MagicAjax有三种不同的页面存储,我这里用的是NoStore,其它两种以后在探:)
到了这句执行结束,其实返回的是整个页面的代码,但页面要实现无刷新更新就只需要变动部分的代码,那这是怎么变出来的呢?答案就在Application_EndRequest这个处理中。首先我们看到前面保存的_request对象发挥了它的作用:
if (_request == null)
return;
return;
只要这是个ajax请求,我们就获得ViewState中的内容并输出到客户端:
if (_magicAjaxContext.IsPageNoStoreMode && _request.Form["__VIEWSTATE"] != null)
{
string vsValue = _filter.GetViewStateFieldValue();
if (vsValue != null && _request.Form["__VIEWSTATE"] != vsValue)
{
AjaxCallHelper.WriteSetFieldScript("__VIEWSTATE", vsValue);
}
}
{
string vsValue = _filter.GetViewStateFieldValue();
if (vsValue != null && _request.Form["__VIEWSTATE"] != vsValue)
{
AjaxCallHelper.WriteSetFieldScript("__VIEWSTATE", vsValue);
}
}
最后,下面的语句:
AjaxCallHelper.End();
正是整个函数的调用,将整个页面的代码转换成变动部分的JS代码。AjaxCallHelper这个类本身就负责输出的。我们可以看它的这个End函数的内容:
public static void End()//在执行这个方法前输出的还是整个页面的代码,但在执行这个方法后就变成了内容变动那部分的javascript代码,这里最后输出的是stringBuilder的部分内容
{
if (_writingLevel > 0)
throw new MagicAjaxException("Script writing level should be 0 at the end of AjaxCall. IncreaseWritingLevel calls do not match DecreaseWritingLevel calls.");
WriteEndSignature();
HttpResponse hr = HttpContext.Current.Response;
hr.Clear();
MergeNextWritingLevelRecursive(0);
hr.Write((_sbWritingLevels[0] as StringBuilder).ToString());
MagicAjaxContext.Current.CompletedAjaxCall = true;
hr.End();
}
{
if (_writingLevel > 0)
throw new MagicAjaxException("Script writing level should be 0 at the end of AjaxCall. IncreaseWritingLevel calls do not match DecreaseWritingLevel calls.");
WriteEndSignature();
HttpResponse hr = HttpContext.Current.Response;
hr.Clear();
MergeNextWritingLevelRecursive(0);
hr.Write((_sbWritingLevels[0] as StringBuilder).ToString());
MagicAjaxContext.Current.CompletedAjaxCall = true;
hr.End();
}
我们可以看到,HttpResponse对象在将输出到客户端时被替换掉了,最后输出的是sbWritingLevels中的一个StringBuilder的文本。这里输出还牵涉到一个脚本等级(估摸应该是这个意思),这个偶还不是很清楚,看来要查点资料了,不知道是不是脚本输出的优先级问题?
这里就是MagicAjax的主要过程,可能其中有不少问题和错误,还请大家不吝指教拉!