2011-11-12 160 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