成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

WebForm頁面內容輸出的細節分析

開發 后端
ASP.NET WebForm頁面內容輸出其實是一個非常舊的話題了,不過這個話題的適用范圍很廣,可以應用到最新的ASP.NET MVC框架上,而且會遇到更多。本文對其中的細節進行了分析。

老趙前日的這篇博文講的是有關ASP.NET WebForm頁面內容輸出方式的內容。盡管這個話題很老,不過在ASP.NET MVC中同樣適用,而且適用的情況有增無減,因此十分重要。希望這篇文章能夠幫助你更好的理解ASP.NET WebForm頁面內容輸出的細節。

這次我們談的話題是“WebForm頁面上輸出內容的方式”。這其實是一個非常舊的話題了,因為本文的內容甚至可以運用于ASP.NET 1.1之上。不過這個話題的適用范圍很廣,因為即使是目前***的ASP.NET MVC框架,它的默認視圖引擎依舊是基于ASP.NET WebForm的(如Page,Control,MasterPage)。甚至說,由于ASP.NET MVC框架的特性,我們會遇到更多在頁面上“直接輸出”內容的情況。因此,這個話題在ASP.NET MVC應用中可能由為重要。

那么就拿ASP.NET MVC舉例吧。假如,我們在頁面上生成一個Partial View,我們可以這么做:

  1. < % Html.RenderPartial("MyPartialView"); %> 

然而,在前一篇文章中我們提出了一個新的方法Partial,它返回一個字符串,它可以在頁面上這樣使用:

  1. < %= Html.Partial("MyPartialView") %> 

一個aspx頁面會被編譯成Page類的一個子類,這個子類的主要“功能”是覆蓋了基類的Render方法:

  1. public class MyPage : Page  
  2. {  
  3.     protected override void Render(HtmlTextWriter writer)  
  4.     {  
  5.         ...  
  6.     }  
  7. }  
  8.  

我們平時在aspx頁面中編寫的大量內容,其實都會變成操作writer的代碼。例如使用writer.Write方法輸出內容,或者把writer交給子控件的Render方法用于生成內容。那么,以上兩種頁面上的標記分別又是如何操作writer的呢?

  1. < %= expression %> 

首先是< %= %>標記。< %= %>標記內包含的是一個“表達式”,因此它不能以分號結尾。表達式內部的數據就會直接寫入writer。例如這樣的標記:

  1. < %= DateTime.Now %> 

在編譯過后就成為:

  1. writer.Write(DateTime.Now) 

與< %= %>標記不同,< % %>標記中間其實包含的是“語句”。語句自然可以有多行,自然每行***需要有分號,這就像我們平時寫C#代碼那樣。不過實際上,語句的功能其實并不是為了“輸出內容”,而是用來“控制邏輯”。例如,您在頁面上寫了這樣的代碼:

  1. < % Func< int, bool> odd = i => i % 2 != 0; %> 

這樣就相當于您在Render方法內部聲明了一個局部變量odd,它的類型是一個Func< int, bool>委托。而如果您編寫這樣的代碼:

  1. < % for (int i = 0; i <  10; i++) { %> 
  2.     < span> 
  3.         < %= i + 1 %> 
  4.     < /span> 
  5. < % } %> 

則生成的Render方法中就會包含:

  1. for (int i = 0; i <  10; i++)  
  2. {  
  3.     writer.Write("< span>");  
  4.     writer.Write(i + 1);  
  5.     writer.Write("< /span>");  

如果是寫在頁面上的普通HTML標記,編譯后就被當作普通字符串來處理了。有些朋友一直談“客戶端控件”等等,其實如果一個元素上沒有runat="server"標記,ASP.NET只是把它們當作普通字符串處理,并不會有任何“HTML元素”的概念。當然,上面的代碼表現的是“意圖”,事實上在編譯過后aspx頁面中的空格和換行等字符也會包含在輸出的內容中1。

那么,既然< % %>中包含的是用來控制邏輯的語句,本身不是用來表示輸出的,那么為什么剛才代碼中的Html.RenderPartial方法也會生成頁面內容呢?那是因為RenderPartial方法直接向當前HttpContext.Response.Output里寫入字符了。很多朋友經常使用Response.Write來輸出內容,其實在Write方法內部就是輸出到Output中。

事實上,即使我們的頁面中使用了HtmlTextWriter來輸出內容,但它內部也是封裝了Output所暴露出的TextWriter中。為了驗證,您可以在代碼中設置斷點并觀察Render方法的writer參數,在“正常情況下”可以發現writer.InnerWriter屬性是一個HttpWriter對象,這是個TextWriter的子類,也是ASP.NET中定義的內部類型。

這便是ASP.NET WebForm頁面內容輸出的細節。那么請問,以下兩種輸出方式的區別是什么呢?

  1. < %= "Hello World" %> 
  2. < % Response.Write("Hello World"); %> 

從效果上看,兩者沒有任何區別。但是實際上前者是使用頁面的HtmlTextWriter對象輸出的,而后者則直接向Response.Output里輸出內容。這個區別看似不重要,但其實它會涉及到我們很多開發過程中可用的實踐方式。在今后的文章中,我會提出生成頁面內容的一些準則,解釋這些準則的原因,并指出ASP.NET MVC本身是如何破壞這些設計準則的。

自然,修改版本的ASP.NET MVC會發布在MvcPatch項目中。

【編輯推薦】

  1. 解決WebForm未定義的原因及方法
  2. WebForm中的ListBox組件編程
  3. ASP.NET MVC與WebForm區別談
  4. ASP.NET Routing之“解析URL”功能詳解
  5. 為ASP.NET MVC應用添加自定義路由
責任編輯:yangsai 來源: 博客園
相關推薦

2017-10-27 06:40:37

2009-07-20 18:01:38

Oracle JDBC

2009-09-22 12:17:51

ibmdwLotus

2009-09-16 13:53:47

WebForm

2009-12-08 08:57:21

ASP.NET MVC

2010-02-03 16:04:34

C++標準類庫

2009-07-31 10:33:54

ASP.NET頁面輸出

2009-07-29 14:35:34

頁面輸出緩存ASP.NET

2022-02-14 10:42:41

移動端標簽設計用戶

2021-03-08 10:49:11

漏洞攻擊網絡安全

2009-11-24 09:09:53

Visual Stud

2022-04-28 07:59:11

Polkitpkexec漏洞

2023-05-18 00:05:47

2009-08-24 09:18:34

ASP.NET MVC

2023-05-08 07:20:22

Doris分析型數據庫

2014-09-19 10:42:32

2010-05-25 13:22:43

2010-01-19 17:28:36

東方通中間件

2012-09-13 09:35:35

CSSJS編程

2021-07-28 07:53:20

語法內容
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲激情网站 | 国产精品爱久久久久久久 | 91视频进入| 日韩国产在线 | 国产精品日韩欧美一区二区 | 亚洲欧美国产精品久久 | 一级大黄色片 | 国产亚洲一区二区三区 | 国产一区二区在线视频 | 久久福利电影 | 久久久精品一区二区三区 | 亚洲综合色自拍一区 | 欧美另类视频 | 亚洲男女视频在线观看 | 久久免费精品视频 | 国产中文字幕av | 国产精品成人久久久久a级 久久蜜桃av一区二区天堂 | 亚洲视频在线看 | 欧美日韩一 | 亚洲欧美一区二区三区国产精品 | 在线观看欧美一区 | 久久久精品综合 | 久久亚洲一区二区三区四区 | 色综合视频 | 国产精品视频97 | 毛片毛片毛片毛片毛片 | 亚洲毛片| 久久久亚洲综合 | 亚洲精品成人免费 | 精品视频一二区 | 国产成人免费在线 | 精品国产精品 | 精品免费视频 | 97精品久久 | 亚洲视频二区 | 中文一区二区 | 亚洲精品美女 | 91夜色在线观看 | www久久av| 日韩一区精品 | 久久一区二区三区四区五区 |