Render()和FrameworkInitialize()方法的迷惑

hsb0307 2004-11-06 02:20:54
页面的FrameworkInitialize()方法如下:
protected override void FrameworkInitialize()
{
__BuildControlTree(this);
base.FileDependencies = __fileDependencies;
base.EnableViewStateMac = true;
base.Request.ValidateInput();
}
private void __BuildControlTree(Control __ctrl)
{
IParserAccessor iParserAccessor = __ctrl;
iParserAccessor.AddParsedSubObject(new LiteralControl("<html>\r\n<head>\r\n<title>dddd</title>\r\n</head>\r\n<body>\r\n"));
//按顺序创建各个页面控件......
iParserAccessor.AddParsedSubObject(new LiteralControl("\r\n</body>\r\n</html>"));
}

而我们在建立页模板时往往这样写:

public class PageBase : System.Web.UI.Page
{
//......
protected override void Render(HtmlTextWriter writer)
{
//创建html及body标签
writer.Write(@"
<html>
<head>
<title>" + Title + @"</title>
</head>
<body>");
//调用基类的Render方法
base.Render( writer );
//结束body和html节点
writer.Write(@"
</body>
</html>");
}
}

为什么FrameworkInitialize()方法中添加了<html>、<body>
iParserAccessor.AddParsedSubObject(new LiteralControl("<html>\r\n<head>\r\n<title>dddd</title>\r\n</head>\r\n<body>\r\n"));

Render()方法还要这样做:

writer.Write(@"
<html>
<head>
<title>" + Title + @"</title>
</head>
<body>");
//调用基类的Render方法
base.Render( writer );

肯定添加<html>、<body>是执行了一次,但却为什么两个方法中都有呈现<html>、<body>的代码?
...全文
144 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hsb0307 2004-11-07
  • 打赏
  • 举报
回复
我先解释一下,不一定正确,请各位指教:
try
{
base.InitRecursive(null);
//递归执行Init()事件,就是当前控件及其子控件的Init()事件。
//也就是递归执行控件树的Init()是事件。Load,PreRender与之相似
//注意OnInit()是方法,而Init()是事件,这一点和Delphi不同。

if (this.IsPostBack)
{
this.LoadPageViewState();
this.ProcessPostData(this._requestValueCollection, true);
}
base.LoadRecursive();

if (this.IsPostBack)
{
this.ProcessPostData(this._leftoverPostData, false);//获取客户端更新
this.RaiseChangedEvents();//使类似CheckBox、TextBox等的change事件能触发
this.RaisePostBackEvent(this._requestValueCollection);//触发定制事件
}

base.PreRenderRecursiveInternal();
this.SavePageViewState();
base.RenderControl(this.CreateHtmlTextWriter(this.Response.Output));
// RenderControl->Render(writer)->RenderChildren(writer)
//没看懂RenderControl是如何执行的,请指教。
}
catch (ThreadAbortException)
{
base.UnloadRecursive(true);
return;
}

"FrameworkInitilaize()方法是在 OnInit 事件之前执行的,而且这里初始化的内容全部是aspx里面的内容,它根本不可能去检查代码中有没有输出 <html><body> 这些代码的.",这是肯定的,关键是FrameworkInitilaize()方法输出了 <html><body> 等标记(当然含响应的结束标记),在后面执行的Render()方法为什么也输出了 <html><body> 等标记,这样不就是输出两次了吗?

真的像你说的:"在重载 Render 方法时可以不输出 <html><body> 这些代码,输出与控件的内容就可以了",我试验一下。(注:这里的重载 Render 方法,指Page类的Render),难道下面这些牛人们不对?

http://blog.joycode.com/liuhuimiao/articles/10519.aspx
是:可以不输出 <html><body> 这些代码,还是一定不能输出 <html><body> tag?

是不是FrameworkInitialize()和Render()方法要配合起来看?
hsb0307 2004-11-07
  • 打赏
  • 举报
回复
看了一下,ASP.NET应用程序的执行流程大体如下:

Application_Start(Object sender, EventArgs e)
Session_Start(Object sender, EventArgs e)
Application_BeginRequest(Object sender, EventArgs e)
Application_AuthenticateRequest(Object sender, EventArgs e)

this.FrameworkInitialize();
try
{
base.InitRecursive(null);
if (this.IsPostBack)
{
this.LoadPageViewState();
this.ProcessPostData(this._requestValueCollection, true);
}
base.LoadRecursive();

if (this.IsPostBack)
{
this.ProcessPostData(this._leftoverPostData, false);
this.RaiseChangedEvents();
this.RaisePostBackEvent(this._requestValueCollection);
}

base.PreRenderRecursiveInternal();
this.SavePageViewState();
base.RenderControl(this.CreateHtmlTextWriter(this.Response.Output));
// RenderControl->Render(writer)->RenderChildren(writer)
}
catch (ThreadAbortException)
{
base.UnloadRecursive(true);
return;
}

不一定正确,没有看懂Render()方法是如何执行的,因为看到FrameworkInitialize()和Render()方法都执行了输出HTML Tag的功能,看来我的理解不对,这两个方法中应该只有一个执行输出HTML Tag才对,我太菜,还是不理解,请耐心指教。谢谢。


而WebForm的代码如下:

namespace ASP
{
using System;
using System.Collections;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.HtmlControls;

public class exam_aspx : Page, IRequiresSessionState
{
// Methods
static exam_aspx()
{
exam_aspx.__initialized = false;
}

public exam_aspx()
{
if (!exam_aspx.__initialized)
{
ArrayList list1 = new ArrayList();
list1.Add(@"F:\MyPro\TempExam\exam.aspx");
exam_aspx.__fileDependencies = list1;
exam_aspx.__initialized = true;
}
}

private Control __BuildControldivTemp()
{
HtmlGenericControl control2 = new HtmlGenericControl("div");
this.divTemp = control2;
control2.ID = "divTemp";
IParserAccessor accessor1 = control2;
accessor1.AddParsedSubObject(new LiteralControl("meme"));
return control2;
}

private void __BuildControlTree(Control __ctrl)
{
IParserAccessor accessor1 = __ctrl;
accessor1.AddParsedSubObject(new LiteralControl("<html>\r\n<head>\r\n<title>dddd</title>\r\n</head>\r\n<body>\r\n"));
this.__BuildControldivTemp();
accessor1.AddParsedSubObject(this.divTemp);
accessor1.AddParsedSubObject(new LiteralControl("\r\n</body>\r\n</html>"));
}

protected override void FrameworkInitialize()
{
this.__BuildControlTree(this);
this.FileDependencies = exam_aspx.__fileDependencies;
this.EnableViewStateMac = true;
this.Request.ValidateInput();
}

// Fields
private static ArrayList __fileDependencies;
private static bool __initialized;
protected HtmlGenericControl divTemp;
}
}

没有看懂Render()方法是如何执行的,因为看到FrameworkInitialize()和Render()方法都执行了输出HTML Tag的功能,看来我的理解不对,这两个方法中应该只有一个执行输出HTML Tag才对,我太菜,还是不理解,请耐心指教。谢谢。

hsb0307 2004-11-07
  • 打赏
  • 举报
回复
"FrameworkInitialize()方法是根据aspx页面中的内容生成相关的控件,然后添加到Page类的Controls集合"这句很对,明白一点了,感谢。

我再慢慢看看Render()方法。
exboy 2004-11-07
  • 打赏
  • 举报
回复
Page 类间接的从 Control 类继承,this.FrameworkInitialize(); 方法是根据aspx页面中的内容生成相关的控件,然后添加到Page类的Controls集合,在RenderContents方法里,会循环调用控件集合里的每一个控件的 RenderContents 方法。
hsb0307 2004-11-07
  • 打赏
  • 举报
回复
自己 up
exboy 2004-11-06
  • 打赏
  • 举报
回复
FrameworkInitilaize() 方法是在 OnInit 事件之前执行的,而且这里初始化的内容全部是aspx里面的内容,它根本不可能去检查代码中有没有输出 <html><body> 这些代码的.
exboy 2004-11-06
  • 打赏
  • 举报
回复
在重载 Render 方法时可以不输出 <html><body> 这些代码,输出与控件的内容就可以了.
hsb0307 2004-11-06
  • 打赏
  • 举报
回复
为什么override页面的Render( writer )时一定要生成<html>、<body>,只生成其子控件不行吗?
hsb0307 2004-11-06
  • 打赏
  • 举报
回复
为什么Render( writer )中已经生成<html>、<body>,FrameworkInitialize()还要在中还要在输出一次,这样不就两次了吗?

为什么override页面的Render( writer )时一定要生成<html>、<body>,这生成其子控件不行吗?
exboy 2004-11-06
  • 打赏
  • 举报
回复
aspx 页面里的 html 代码都会被编译成一个 LiteralControl 类型的控件的,所以如果你的 aspx 文件里面有<html>或其他的html代码,都会通过 FramewrodInitialize() 方法来初始化.
exboy 2004-11-06
  • 打赏
  • 举报
回复
FrameworkInitialize() 方法是初始化 aspx 里面的内容,在运行时,aspx 也被编译成一个类.

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧