解析ASP.NET WebForm頁面內(nèi)容輸出方式_.Net教程
推薦:揭秘.Net開發(fā)人員必知的八個網(wǎng)站當(dāng)前全球有數(shù)百萬的開發(fā)人員在使用微軟的.NET技術(shù)。如果你是其中之一,或者想要成為其中之一的話,我下面將要列出的每一個站點(diǎn)都應(yīng)該是你的最愛,都應(yīng)該收藏到書簽中去。 對于不熟悉.NET技術(shù)的朋友,需要說明一下,.NET提供了一個平臺和一些相應(yīng)的工具,編程
就拿ASP.NET MVC舉例吧。假如,我們在頁面上生成一個Partial View,我們可以這么做:
<% Html.RenderPartial("MyPartialView"); %> |
然而,在前一篇文章中我們提出了一個新的方法Partial,它返回一個字符串,它可以在頁面上這樣使用:
<%= Html.Partial("MyPartialView") %> |
一個aspx頁面會被編譯成Page類的一個子類,這個子類的主要“功能”是覆蓋了基類的Render方法:
public class MyPage : Page { protected override void Render(HtmlTextWriter writer) { ... } } |
我們平時在aspx頁面中編寫的大量內(nèi)容,其實都會變成操作writer的代碼。例如使用writer.Write方法輸出內(nèi)容,或者把writer交給子控件的Render方法用于生成內(nèi)容。那么,以上兩種頁面上的標(biāo)記分別又是如何操作writer的呢?
<%= expression %> |
首先是<%= %>標(biāo)記。<%= %>標(biāo)記內(nèi)包含的是一個“表達(dá)式”,因此它不能以分號結(jié)尾。表達(dá)式內(nèi)部的數(shù)據(jù)就會直接寫入writer。例如這樣的標(biāo)記:
<%= DateTime.Now %> |
在編譯過后就成為:
writer.Write(DateTime.Now) |
與<%= %>標(biāo)記不同,<% %>標(biāo)記中間其實包含的是“語句”。語句自然可以有多行,自然每行最后需要有分號,這就像我們平時寫C#代碼那樣。不過實際上,語句的功能其實并不是為了“輸出內(nèi)容”,而是用來“控制邏輯”。例如,您在頁面上寫了這樣的代碼:
<% Func<int, bool> odd = i => i % 2 != 0; %> |
這樣就相當(dāng)于您在Render方法內(nèi)部聲明了一個局部變量odd,它的類型是一個Func<int, bool>委托。而如果您編寫這樣的代碼:
<% for (int i = 0; i < 10; i++) { %> <span> <%= i + 1 %> </span> <% } %> |
則生成的Render方法中就會包含:
for (int i = 0; i < 10; i++) { writer.Write("<span>"); writer.Write(i + 1); writer.Write("</span>"); } |
如果是寫在頁面上的普通HTML標(biāo)記,編譯后就被當(dāng)作普通字符串來處理了。有些朋友一直談“客戶端控件”等等,其實如果一個元素上沒有runat="server"標(biāo)記,ASP.NET只是把它們當(dāng)作普通字符串處理,并不會有任何“HTML元素”的概念。當(dāng)然,上面的代碼表現(xiàn)的是“意圖”,事實上在編譯過后aspx頁面中的空格和換行等字符也會包含在輸出的內(nèi)容中。
那么,既然<% %>中包含的是用來控制邏輯的語句,本身不是用來表示輸出的,那么為什么剛才代碼中的Html.RenderPartial方法也會生成頁面內(nèi)容呢?那是因為RenderPartial方法直接向當(dāng)前HttpContext.Response.Output里寫入字符了。很多朋友經(jīng)常使用Response.Write來輸出內(nèi)容,其實在Write方法內(nèi)部就是輸出到Output中。
事實上,即使我們的頁面中使用了HtmlTextWriter來輸出內(nèi)容,但它內(nèi)部也是封裝了Output所暴露出的TextWriter中。為了驗證,您可以在代碼中設(shè)置斷點(diǎn)并觀察Render方法的writer參數(shù),在“正常情況下”可以發(fā)現(xiàn)writer.InnerWriter屬性是一個HttpWriter對象,這是個TextWriter的子類,也是ASP.NET中定義的內(nèi)部類型。
這便是ASP.NET頁面輸出的細(xì)節(jié)。那么請問,以下兩種輸出方式的區(qū)別是什么呢?
<%= "Hello World" %> <% Response.Write("Hello World") %> |
從效果上看,兩者沒有任何區(qū)別。但是實際上前者是使用頁面的HtmlTextWriter對象輸出的,而后者則直接向Response.Output里輸出內(nèi)容。這個區(qū)別看似不重要,但其實它會涉及到我們很多開發(fā)過程中可用的實踐方式。在今后的文章中,我會提出生成頁面內(nèi)容的一些準(zhǔn)則,解釋這些準(zhǔn)則的原因,并指出ASP.NET MVC本身是如何破壞這些設(shè)計準(zhǔn)則的。
自然,修改版本的ASP.NET MVC會發(fā)布在MvcPatch項目中。
分享:淺談ADO.NET Entity Framework存取數(shù)據(jù)庫中圖片網(wǎng)站中的圖片可以保存到文件系統(tǒng)中,即專門的目錄用于圖片的存放,這樣的存儲配上數(shù)據(jù)庫中保存的圖片路徑信息,相信很多網(wǎng)站是這么選擇的。這樣的搭配由于存儲和管理信息是分開的,其優(yōu)點(diǎn)就是對數(shù)據(jù)庫的性能不會產(chǎn)生太大影響,但是也正是由于這種分開網(wǎng)站的
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實例(可帶附件)
- js實現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實現(xiàn)
- Asp.Net 無刷新文件上傳并顯示進(jìn)度條的實現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(連接字符串的配置及獲取)
- asp.net頁面?zhèn)髦禍y試實例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲過程實現(xiàn)分頁示例代碼
- 相關(guān)鏈接:
- 教程說明:
.Net教程-解析ASP.NET WebForm頁面內(nèi)容輸出方式。