老趙前日的這篇博文講的是有關ASPNET WebForm頁面內容輸出方式的內容盡管這個話題很老不過在ASPNET MVC中同樣適用而且適用的情況有增無減因此十分重要希望這篇文章能夠幫助你更好的理解ASPNET WebForm頁面內容輸出的細節
這次我們談的話題是WebForm頁面上輸出內容的方式這其實是一個非常舊的話題了因為本文的內容甚至可以運用於ASPNET 之上不過這個話題的適用范圍很廣因為即使是目前最新的ASPNET MVC框架它的默認視圖引擎依舊是基於ASPNET WebForm的(如PageControlMasterPage)甚至說由於ASPNET MVC框架的特性我們會遇到更多在頁面上直接輸出內容的情況因此這個話題在ASPNET MVC應用中可能由為重要
那麼就拿ASPNET MVC舉例吧假如我們在頁面上生成一個Partial View我們可以這麼做
< % HtmlRenderPartial(MyPartialView); %> 然而在前一篇文章中我們提出了一個新的方法Partial它返回一個字符串它可以在頁面上這樣使用
< %= HtmlPartial(MyPartialView) %> 一個aspx頁面會被編譯成Page類的一個子類這個子類的主要功能是覆蓋了基類的Render方法
public class MyPage : Page
{
protected override void Render(HtmlTextWriter writer)
{
}
} 我們平時在aspx頁面中編寫的大量內容其實都會變成操作writer的代碼例如使用writerWrite方法輸出內容或者把writer交給子控件的Render方法用於生成內容那麼以上兩種頁面上的標記分別又是如何操作writer的呢?
< %= expression %> 首先是< %= %>標記< %= %>標記內包含的是一個表達式因此它不能以分號結尾表達式內部的數據就會直接寫入writer例如這樣的標記
< %= DateTimeNow %> 在編譯過後就成為
writerWrite(DateTimeNow) 與< %= %>標記不同< % %>標記中間其實包含的是語句語句自然可以有多行自然每行最後需要有分號這就像我們平時寫C#代碼那樣不過實際上語句的功能其實並不是為了輸出內容而是用來控制邏輯例如您在頁面上寫了這樣的代碼
< % Func< int bool> odd = i => i % != ; %> 這樣就相當於您在Render方法內部聲明了一個局部變量odd它的類型是一個Func< int bool>委托而如果您編寫這樣的代碼
< % for (int i = ; i < ; i++)
{
%> < span> < %= i + %> < /span> < %
}
%>
則生成的Render方法中就會包含
for (int i = ; i < ; i++)
{
writerWrite(< span>);
writerWrite(i + );
writerWrite(< /span>);
}
如果是寫在頁面上的普通HTML標記編譯後就被當作普通字符串來處理了有些朋友一直談客戶端控件等等其實如果一個元素上沒有runat=server標記ASPNET只是把它們當作普通字符串處理並不會有任何HTML元素的概念當然上面的代碼表現的是意圖事實上在編譯過後aspx頁面中的空格和換行等字符也會包含在輸出的內容中
那麼既然< % %>中包含的是用來控制邏輯的語句本身不是用來表示輸出的那麼為什麼剛才代碼中的HtmlRenderPartial方法也會生成頁面內容呢?那是因為RenderPartial方法直接向當前HttpContextResponseOutput裡寫入字符了很多朋友經常使用ResponseWrite來輸出內容其實在Write方法內部就是輸出到Output中
事實上即使我們的頁面中使用了HtmlTextWriter來輸出內容但它內部也是封裝了Output所暴露出的TextWriter中為了驗證您可以在代碼中設置斷點並觀察Render方法的writer參數在正常情況下可以發現writerInnerWriter屬性是一個HttpWriter對象這是個TextWriter的子類也是ASPNET中定義的內部類型
這便是ASPNET WebForm頁面內容輸出的細節那麼請問以下兩種輸出方式的區別是什麼呢?
< %= Hello World %> < % ResponseWrite(Hello World); %> 從效果上看兩者沒有任何區別但是實際上前者是使用頁面的HtmlTextWriter對象輸出的而後者則直接向ResponseOutput裡輸出內容這個區別看似不重要但其實它會涉及到我們很多開發過程中可用的實踐方式在今後的文章中我會提出生成頁面內容的一些准則解釋這些准則的原因並指出ASPNET MVC本身是如何破壞這些設計准則的
From:http://tw.wingwit.com/Article/program/net/201311/13683.html