国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > .NET > 正文

解析ASP.NET WebForm頁(yè)面內(nèi)容輸出方式_.Net教程

2024-07-10 12:51:45
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

推薦:揭秘.Net開(kāi)發(fā)人員必知的八個(gè)網(wǎng)站
當(dāng)前全球有數(shù)百萬(wàn)的開(kāi)發(fā)人員在使用微軟的.NET技術(shù)。如果你是其中之一,或者想要成為其中之一的話,我下面將要列出的每一個(gè)站點(diǎn)都應(yīng)該是你的最?lèi)?ài),都應(yīng)該收藏到書(shū)簽中去。 對(duì)于不熟悉.NET技術(shù)的朋友,需要說(shuō)明一下,.NET提供了一個(gè)平臺(tái)和一些相應(yīng)的工具,編程

就拿ASP.NET MVC舉例吧。假如,我們?cè)陧?yè)面上生成一個(gè)Partial View,我們可以這么做:

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

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

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

一個(gè)aspx頁(yè)面會(huì)被編譯成Page類(lèi)的一個(gè)子類(lèi),這個(gè)子類(lèi)的主要“功能”是覆蓋了基類(lèi)的Render方法:

public class MyPage : Page
{
    protected override void Render(HtmlTextWriter writer)
    {
        ...
    }
} 
 
我們平時(shí)在aspx頁(yè)面中編寫(xiě)的大量?jī)?nèi)容,其實(shí)都會(huì)變成操作writer的代碼。例如使用writer.Write方法輸出內(nèi)容,或者把writer交給子控件的Render方法用于生成內(nèi)容。那么,以上兩種頁(yè)面上的標(biāo)記分別又是如何操作writer的呢?

<%= expression %>

首先是<%= %>標(biāo)記。<%= %>標(biāo)記內(nèi)包含的是一個(gè)“表達(dá)式”,因此它不能以分號(hào)結(jié)尾。表達(dá)式內(nèi)部的數(shù)據(jù)就會(huì)直接寫(xiě)入writer。例如這樣的標(biāo)記:

<%= DateTime.Now %>

在編譯過(guò)后就成為:

writer.Write(DateTime.Now)

與<%= %>標(biāo)記不同,<% %>標(biāo)記中間其實(shí)包含的是“語(yǔ)句”。語(yǔ)句自然可以有多行,自然每行最后需要有分號(hào),這就像我們平時(shí)寫(xiě)C#代碼那樣。不過(guò)實(shí)際上,語(yǔ)句的功能其實(shí)并不是為了“輸出內(nèi)容”,而是用來(lái)“控制邏輯”。例如,您在頁(yè)面上寫(xiě)了這樣的代碼:

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

這樣就相當(dāng)于您在Render方法內(nèi)部聲明了一個(gè)局部變量odd,它的類(lèi)型是一個(gè)Func<int, bool>委托。而如果您編寫(xiě)這樣的代碼:

<% for (int i = 0; i < 10; i++) { %>
    <span>
        <%= i + 1 %>
    </span>
<% } %>

則生成的Render方法中就會(huì)包含:

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

如果是寫(xiě)在頁(yè)面上的普通HTML標(biāo)記,編譯后就被當(dāng)作普通字符串來(lái)處理了。有些朋友一直談“客戶(hù)端控件”等等,其實(shí)如果一個(gè)元素上沒(méi)有runat="server"標(biāo)記,ASP.NET只是把它們當(dāng)作普通字符串處理,并不會(huì)有任何“HTML元素”的概念。當(dāng)然,上面的代碼表現(xiàn)的是“意圖”,事實(shí)上在編譯過(guò)后aspx頁(yè)面中的空格和換行等字符也會(huì)包含在輸出的內(nèi)容中。

那么,既然<% %>中包含的是用來(lái)控制邏輯的語(yǔ)句,本身不是用來(lái)表示輸出的,那么為什么剛才代碼中的Html.RenderPartial方法也會(huì)生成頁(yè)面內(nèi)容呢?那是因?yàn)镽enderPartial方法直接向當(dāng)前HttpContext.Response.Output里寫(xiě)入字符了。很多朋友經(jīng)常使用Response.Write來(lái)輸出內(nèi)容,其實(shí)在Write方法內(nèi)部就是輸出到Output中。

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

這便是ASP.NET頁(yè)面輸出的細(xì)節(jié)。那么請(qǐng)問(wèn),以下兩種輸出方式的區(qū)別是什么呢?

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

從效果上看,兩者沒(méi)有任何區(qū)別。但是實(shí)際上前者是使用頁(yè)面的HtmlTextWriter對(duì)象輸出的,而后者則直接向Response.Output里輸出內(nèi)容。這個(gè)區(qū)別看似不重要,但其實(shí)它會(huì)涉及到我們很多開(kāi)發(fā)過(guò)程中可用的實(shí)踐方式。在今后的文章中,我會(huì)提出生成頁(yè)面內(nèi)容的一些準(zhǔn)則,解釋這些準(zhǔn)則的原因,并指出ASP.NET MVC本身是如何破壞這些設(shè)計(jì)準(zhǔn)則的。

自然,修改版本的ASP.NET MVC會(huì)發(fā)布在MvcPatch項(xiàng)目中。

 

分享:淺談ADO.NET Entity Framework存取數(shù)據(jù)庫(kù)中圖片
網(wǎng)站中的圖片可以保存到文件系統(tǒng)中,即專(zhuān)門(mén)的目錄用于圖片的存放,這樣的存儲(chǔ)配上數(shù)據(jù)庫(kù)中保存的圖片路徑信息,相信很多網(wǎng)站是這么選擇的。這樣的搭配由于存儲(chǔ)和管理信息是分開(kāi)的,其優(yōu)點(diǎn)就是對(duì)數(shù)據(jù)庫(kù)的性能不會(huì)產(chǎn)生太大影響,但是也正是由于這種分開(kāi)網(wǎng)站的

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 涡阳县| 类乌齐县| 右玉县| 利津县| 武夷山市| 崇仁县| 景宁| 基隆市| 潞西市| 深水埗区| 德庆县| 康保县| 桂东县| 通州区| 广州市| 文山县| 精河县| 大宁县| 台南市| 绿春县| 醴陵市| 兖州市| 万源市| 阳新县| 利辛县| 文安县| 马关县| 城步| 固镇县| 周至县| 临泉县| 万载县| 温宿县| 繁昌县| 宝清县| 祁东县| 齐齐哈尔市| 塔城市| 益阳市| 苗栗县| 天门市|