上面代码的注释说,控件会在加入控件树之前被初始化,因此我们要保证Page不为Null。
我认为:在根据声明语法生成控件树的过程中,执行到此步骤时,控件树已经生成了一部分,即Page在此时不可能为Null,因此不用判断Null。可是跟踪发现Page确实是Null,原因可能是,控件树已经部分生成,Page已经生成。但在此时子控件是不能访问Page的,所以才会是Null。
下面是编译源:
private System.Web.UI.Control __BuildControlForm1() {
System.Web.UI.HtmlControls.HtmlForm __ctrl;
__ctrl = new System.Web.UI.HtmlControls.HtmlForm();
this.Form1 = __ctrl;
__ctrl.ID = "Form1";
__ctrl.Method = "post";
System.Web.UI.IParserAccessor __parser = ((System.Web.UI.IParserAccessor)(__ctrl));
__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n\t\t\t"));
this.__BuildControlPageTracker3();
__parser.AddParsedSubObject(this.PageTracker3);
__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n\t\t\t\t"));
this.__BuildControlButton1();
__parser.AddParsedSubObject(this.Button1);
__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\t"));
return __ctrl;
}
private void __BuildControlTree(System.Web.UI.Control __ctrl) {
System.Web.UI.IParserAccessor __parser = ((System.Web.UI.IParserAccessor)(__ctrl));
__parser.AddParsedSubObject(this.CreateResourceBasedLiteralControl(0, 377, true));
__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n\t</HEAD>\r\n\t<body>\r\n\t\t"));
this.__BuildControlForm1();
__parser.AddParsedSubObject(this.Form1);
__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n\t</body>\r\n</HTML>\r\n"));
}
protected override void FrameworkInitialize() {
SetStringResourcePointer(ASP.WebForm1_aspx.__stringResource, 377);
this.__BuildControlTree(this);
this.FileDependencies = ASP.WebForm1_aspx.__fileDependencies;
this.EnableViewStateMac = true;
this.Request.ValidateInput();
}
System.Web.UI.HtmlControls.HtmlForm __ctrl;
__ctrl = new System.Web.UI.HtmlControls.HtmlForm();
this.Form1 = __ctrl;
__ctrl.ID = "Form1";
__ctrl.Method = "post";
System.Web.UI.IParserAccessor __parser = ((System.Web.UI.IParserAccessor)(__ctrl));
__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n\t\t\t"));
this.__BuildControlPageTracker3();
__parser.AddParsedSubObject(this.PageTracker3);
__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n\t\t\t\t"));
this.__BuildControlButton1();
__parser.AddParsedSubObject(this.Button1);
__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\t"));
return __ctrl;
}
private void __BuildControlTree(System.Web.UI.Control __ctrl) {
System.Web.UI.IParserAccessor __parser = ((System.Web.UI.IParserAccessor)(__ctrl));
__parser.AddParsedSubObject(this.CreateResourceBasedLiteralControl(0, 377, true));
__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n\t</HEAD>\r\n\t<body>\r\n\t\t"));
this.__BuildControlForm1();
__parser.AddParsedSubObject(this.Form1);
__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n\t</body>\r\n</HTML>\r\n"));
}
protected override void FrameworkInitialize() {
SetStringResourcePointer(ASP.WebForm1_aspx.__stringResource, 377);
this.__BuildControlTree(this);
this.FileDependencies = ASP.WebForm1_aspx.__fileDependencies;
this.EnableViewStateMac = true;
this.Request.ValidateInput();
}
protected virtual void AddParsedSubObject(object obj)
{
Control control1 = obj as Control;
if (control1 != null)
{
this.Controls.Add(control1);
}
}
{
Control control1 = obj as Control;
if (control1 != null)
{
this.Controls.Add(control1);
}
}
可以看到在执行Init前,会编译运行上面自动生成的编译源,这样以来第一个问题就彻底清楚了,也证明我上面的判断是正确的。