2011-11-12 130 views
2

片段1:为什么这两个代码片段的输出有区别?

<% _message.InnerText = this.GetType().ToString(); %> 
<h3>Page type: <span id=_message runat=server/></h3> 

片段2:

<h3>Page type: <span id=_message runat=server/></h3> 
<% _message.InnerText = this.GetType().ToString(); %> 

1给了我预期的输出,但2给我什么。

为什么?

+3

其原因是在代码段2中,span是ALREADY呈现的,这就是为什么对该控件所做的任何更改只会在下一次回发中生效,而代码段1中的更改​​反之亦然。 –

回答

0

就像莱纳斯说的,“阅读f ***源代码”。 所以我反编译的代码,并得到这个:

为1

// ASP.default_aspx 
private void __Renderform1(HtmlTextWriter __w, Control parameterContainer) 
{ 
    __w.Write("\r\n "); 
    parameterContainer.Controls[0].RenderControl(__w); 
    __w.Write("\r\n start\r\n  <h3>Page type:"); 
    parameterContainer.Controls[1].RenderControl(__w); 
    __w.Write("</h3>\r\n  "); 
    this._message.InnerText = base.GetType().ToString(); 
    __w.Write("\r\n end\r\n "); 
} 

为2

// ASP.default_aspx 
private void __Renderform1(HtmlTextWriter __w, Control parameterContainer) 
{ 
    __w.Write("\r\n "); 
    parameterContainer.Controls[0].RenderControl(__w); 
    __w.Write("\r\n start\r\n  "); 
    this._message.InnerText = base.GetType().ToString(); 
    __w.Write("\r\n  <h3>Page type:"); 
    parameterContainer.Controls[1].RenderControl(__w); // Here the change has no effect. 
    __w.Write("</h3>\r\n end\r\n "); 
} 

因此,有是2关键点:

  1. ASP.NET分析器呈现从上到下的整个页面 时尚,从字面上看是

  2. 这个混淆来自于我对桌面应用程序的经验。

对于桌面应用程序,它就像:代码 - > Memeory - > UI

对于ASP.NET应用程序,它就像:代码 - >内存 - >输出继电器Buffer-> UI

在代码片段2的变化发生在代码 - >内存步骤中,但它没有机会向输出缓冲区进行提示,因此在最终用户界面上没有任何变化。

因此,根本原因是我们有一个额外的阶段,才能到达ASP.NET应用程序的UI。

我希望我明确自己。

+0

试着编辑你的文章并回答。不要在你的问题中更新答案。 – bharath

+0

感谢提醒。完成。 – smwikipedia

1

正如有人在评论中指出的那样,这是因为span代码已经在代码执行前呈现并传递到浏览器。不过,我相信如果您将Response.Buffer标志设置为true,它们将表现相同。把下面这行代码在你的页面的顶部:

<% Response.Buffer = true; %> 

(我只是猜测这里我没有测试过这一点,因为情况是你应该避免的开始。)

有趣的是,我相信你的演示是为什么内联代码只是一个坏主意的很好例子之一。这种方法最终不能很好地与网络服务器和Web浏览器的行为方式吻合。

+0

谢谢。我试图设置Response.Buffer = true。不工作。 – smwikipedia

+0

Responser.Buffer确定何时缓冲输出,直到完成响应准备就绪。这与页面控件的呈现顺序无关。 – smwikipedia