Response.Redirect方式向自画面迁移时Response.QueryString<>null,所以要特殊判断。
3.2 this._isCrossPagePostBack
if (this._isCrossPagePostBack)
{
return true;
}
在Page的PreviousPage属性中会对_isCrossPagePostBack进行设置,具体代码如下:
public Page PreviousPage
{
get
{
…
ITypedWebObjectFactory vPathBuildResult = (ITypedWebObjectFactory) BuildManager.GetVPathBuildResult(this.Context,
this._previousPagePath);
if (typeof(Page).IsAssignableFrom(vPathBuildResult.InstantiatedType))
{
this._previousPage = (Page) vPathBuildResult.CreateInstance();
this._previousPage._isCrossPagePostBack = true;
this.Server.Execute(this._previousPage, TextWriter.Null, true, false);
}
}
return this._previousPage;
}
}
在发生跨页面提交的时候,当访问PreviousPage属性的时候源Page的IsCrossPagePostBack会被设置true。此处得出结论⑤发生跨页提交
(CrossPagePostBack),当访问PreviousPage属性的时候,对于源Page,IsPostBack=true。
3.3 this._pageFlags
if (this._pageFlags)
{
return false;
}
在Page. ProcessRequestMain中有如下的代码片断对_pageFlags进行赋值。
else if (!this.IsCrossPagePostBack)
{
VirtualPath path = null;
if (this._requestValueCollection["__PREVIOUSPAGE"] != null)
{
try
{
path = VirtualPath.CreateNonRelativeAllowNull(
DecryptString(this._requestValueCollection["__PREVIOUSPAGE"]));
}
catch (CryptographicException)
{
this._pageFlags = true;
}
if ((path != null) && (path != this.Request.CurrentExecutionFilePathObject))
{
this._pageFlags = true;
this._previousPagePath = path;
}
}
}
解密发生异常时_pageFlags为true这种异常发生的可能性比较小我们忽略,重点看另外一种情形,将这种情形的所有条件结合起来就是
IsCrossPagePostBack=false && _requestValueCollection["__PREVIOUSPAGE"] != null && path != null && (path !=
this.Request.CurrentExecutionFilePathObject)。发生跨页提交时对于目标页面IsCrossPagePostBack=false,此时源页面
的"__PREVIOUSPAGE"等信息会提交给目标页面,所以_requestValueCollection["__PREVIOUSPAGE"] != null。此时当前请求的
CurrentExecutionFilePathObject是根据目标页的路径生成的,与使用_requestValueCollection["__PREVIOUSPAGE"]生成的path对象不同。
此处得出结论⑥发生跨页提交(CrossPagePostBack)时目标页面是IsPostBack=false。为什么需要对CrossPagePostBack的目标页面做这样的
处理呢?发生CrossPagePostBack时,会将源页面的信息提交给目标页面此时Request.Form!=null,而且包括__VIEWSTATE等键按照其他的规
则会判断为IsPostBack=true,所以需要对CrossPagePostBack的目标页面做特殊的判断。
3.4 (this.Context.ServerExecuteDepth <= 0) || ((this.Context.Handler != null) && (base.GetType() ==
this.Context.Handler.GetType()))
在HttpServerUtility中有如下的代码对Context. ServerExecuteDepth进行了操作。
public void Execute(string path, TextWriter writer, bool preserveForm)
{
…
try
{
this._context.ServerExecuteDepth++;
handler = this._context.ApplicationInstance.MapHttpHandler(this._context, request.RequestType, path3, filename,
useAppConfig);
}
finally
{
this