《ASP NET程序設(shè)計(jì)案例教程》課件第7章_第1頁
《ASP NET程序設(shè)計(jì)案例教程》課件第7章_第2頁
《ASP NET程序設(shè)計(jì)案例教程》課件第7章_第3頁
《ASP NET程序設(shè)計(jì)案例教程》課件第7章_第4頁
《ASP NET程序設(shè)計(jì)案例教程》課件第7章_第5頁
已閱讀5頁,還剩58頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第7章模塊6——站點(diǎn)計(jì)數(shù)7.1【任務(wù)14】站點(diǎn)計(jì)數(shù)器實(shí)現(xiàn)

【本章提要】

本章以校園在線超市系統(tǒng)中站點(diǎn)計(jì)數(shù)模塊的實(shí)現(xiàn)為中心,詳細(xì)介紹Application對(duì)象及Global.asax文件在Web應(yīng)用程序系統(tǒng)中的作用,并介紹用戶控件的應(yīng)用方法。

【學(xué)習(xí)目標(biāo)】

·掌握Application對(duì)象的使用。

·掌握Global.asax文件的使用。

·掌握用戶控件的應(yīng)用。

任務(wù)描述

在校園在線超市系統(tǒng)中,希望在站點(diǎn)中的所有頁面顯示當(dāng)前在線人數(shù)(包括匿名用戶和已登錄用戶),并自動(dòng)累加用戶訪問量,在網(wǎng)頁上顯示站點(diǎn)的累計(jì)訪問量。7.1【任務(wù)14】站點(diǎn)計(jì)數(shù)器實(shí)現(xiàn)

必備知識(shí)

知識(shí)1Application對(duì)象

1.Application對(duì)象簡介

在ASP.NET中,Application對(duì)象代表ASP.NETWeb應(yīng)用程序的運(yùn)行實(shí)例。一個(gè)Web站點(diǎn)可以包含不止一個(gè)ASP.NET應(yīng)用程序,而每個(gè)ASP.NET應(yīng)用程序的運(yùn)行實(shí)例都可以由一個(gè)Applicaition對(duì)象來表達(dá)。

Application對(duì)象可以用來在整個(gè)應(yīng)用程序中共享信息,在.NET中對(duì)應(yīng)HttpApplicationState類,意指“應(yīng)用程序狀態(tài)”??梢灾苯釉趹?yīng)用程序狀態(tài)中存儲(chǔ)變量和對(duì)象。實(shí)際上,應(yīng)用程序狀態(tài)變量是給定ASP.NET應(yīng)用程序的全局變量,它的生命周期從請(qǐng)求該Web應(yīng)用程序的第一個(gè)頁面開始,到該Web站點(diǎn)關(guān)閉,或程序顯式清除Application變量時(shí)結(jié)束。

實(shí)際上,ASP.NET開發(fā)人員可以考慮將任何對(duì)象作為全局變量存儲(chǔ)在Application對(duì)象中,Application維護(hù)了一個(gè)鍵/值對(duì)集合,用鍵/值來區(qū)分集合中的不同項(xiàng)目。當(dāng)使用鍵/值存儲(chǔ)了一個(gè)數(shù)值時(shí),就可以在Web應(yīng)用程序的不同頁面中使用該數(shù)值,從而達(dá)到數(shù)據(jù)共享的目的。

2.使用Application對(duì)象保存信息

1)

Application對(duì)象常用的屬性和方法

Application對(duì)象常用的屬性如表7-1所示。表7-1Application對(duì)象常用的屬性表7-2Application對(duì)象常用的方法下面對(duì)某些屬性和方法作具體說明。

①將新的對(duì)象添加到HttpApplicationState集合中。

Application["chat"]=TextBox1.Text;

Application.Add("chat",TextBox1.Text);

②獲取單個(gè)HttpApplicationState對(duì)象的值。

Label1.Text=Application["chat"].ToString();

Label1.Text=Application.Get("chat").ToString();③更新HttpApplicationState集合中的對(duì)象值。

Application.Set("chat",TextBox1.Text);

④從HttpApplicationState集合中移除命名對(duì)象。

Application.Remove("chat");

⑤從HttpApplicationState集合中移除所有對(duì)象。

Application.Remove();

Application.Clear();

2)應(yīng)用程序狀態(tài)同步

ASP.NET并發(fā)處理客戶端的請(qǐng)求,應(yīng)用程序中的多個(gè)線程可以同時(shí)訪問存儲(chǔ)在應(yīng)用程序狀態(tài)中的值,所以有可能存在多個(gè)用戶同時(shí)存取同一個(gè)Application對(duì)象的情況。這樣就有可能出現(xiàn)多個(gè)用戶修改同一個(gè)Application對(duì)象的情形,造成數(shù)據(jù)不一致的問題。

HttpApplicationState類提供兩種方法,即Lock和Unlock來解決對(duì)Application對(duì)象的訪問同步問題,一次只允許一個(gè)線程訪問應(yīng)用程序狀態(tài)變量。對(duì)Application對(duì)象調(diào)用Lock方法可以鎖定當(dāng)前Application對(duì)象,以便讓當(dāng)前用戶線程單獨(dú)進(jìn)行寫入或修改。當(dāng)寫入或修改完成后,對(duì)Application對(duì)象調(diào)用Unlock方法,解除對(duì)當(dāng)前Application對(duì)象的鎖定,這樣其他用戶線程才能夠?qū)pplication對(duì)象進(jìn)行修改。

只有當(dāng)調(diào)用Lock的用戶線程對(duì)Application對(duì)象調(diào)用相應(yīng)的Unlock方法時(shí)才會(huì)解除對(duì)其他用戶線程的修改限制。Lock方法和UnLock方法應(yīng)該成對(duì)使用。代碼如下:

Application.Lock();

Application["chat"]=TextBox1.Text;

Application.UnLock();

如果沒有顯示調(diào)用Unlock方法解除鎖定,則當(dāng)請(qǐng)求完成、請(qǐng)求超時(shí)或請(qǐng)求執(zhí)行過程中出現(xiàn)未處理的錯(cuò)誤并導(dǎo)致請(qǐng)求失敗時(shí),.NETFramework將自動(dòng)解除鎖定。這種自動(dòng)取消鎖定會(huì)防止應(yīng)用程序出現(xiàn)死鎖。知識(shí)2Global.asax文件

每個(gè)ASP.NET站點(diǎn)對(duì)應(yīng)一個(gè)Global.asax文件,該文件存儲(chǔ)在站點(diǎn)的虛擬根目錄下。Global.asax文件可以處理應(yīng)用程序和會(huì)話(開始和結(jié)束)用來初始化應(yīng)用程序變量和會(huì)話變量的事件。Global.asax文件是可選的。如果沒有定義此文件,ASP.NET頁面會(huì)假定沒有定義任何應(yīng)用程序或會(huì)話的事件處理程序。

Global.asax文件是一個(gè)聲明文件,用來在Web應(yīng)用程序運(yùn)行時(shí)處理事件,如圖7-1所示。

圖7-1頁面請(qǐng)求處理過程

Global.asax文件支持三種類型的事件:請(qǐng)求頁面時(shí)激發(fā)的事件、發(fā)送被請(qǐng)求的頁時(shí)激發(fā)的事件和條件應(yīng)用程序事件,各事件的描述分別如表7-3、表7-4和表7-5所示。表7-3請(qǐng)求頁面時(shí)激發(fā)的事件表7-4發(fā)送被請(qǐng)求的頁時(shí)激發(fā)的事件表7-5條件應(yīng)用程序事件在下面的例子中使用Application對(duì)象實(shí)現(xiàn)了一個(gè)簡單的聊天室。使用框架結(jié)構(gòu),底部頁面用于書寫聊天內(nèi)容,頂部用于顯示內(nèi)容并每隔幾秒鐘刷新一次。

底部頁面主要代碼如下:

protectedvoidButton1_Click(objectsender,EventArgse){

stringtab="";

stringnewline="\r";

stringnewMessage=TextBox2.Text+":"+tab+TextBox3.Text+newline+Application["Chat"];

if(newMessage.Length>500){

newMessage=newMessage.Substring(0,499);

}

Application["Chat"]=newMessage;

TextBox3.Text="";

}頂部頁面主要代碼如下:

protectedvoidPage_Load(objectsender,EventArgse){

TextBox1.Text=(string)Application["chat"];

}

其效果如圖7-2所示。

圖7-2頁面瀏覽效果圖知識(shí)3Literal控件

Literal控件用于將靜態(tài)文本呈現(xiàn)在ASP.NET頁上,并使用服務(wù)器代碼操縱該文本。與Label控件不同,Literal控件不將任何HTML元素添加到文本上。例如,想要?jiǎng)?chuàng)建可以編程方式操縱的文本元素的簡單垂直列表,可以通過將Label控件或Literal控件的Text屬性設(shè)置為要發(fā)送到Web頁的HTML內(nèi)容的方法來進(jìn)行。如果使用Label控件,則該控件被包裝在<span>標(biāo)記中。<span>不以任何顯而易見的方式影響該頁的呈現(xiàn)。如果使用Literal控件,將不添加<span>標(biāo)記,這使您的代碼更為簡單,但無法將樣式應(yīng)用于Literal控件的內(nèi)容,即Literal控件是無法定位的。因此,Literal可能不適合于創(chuàng)建標(biāo)題,也無法使用客戶端代碼確定控件的位置。

下面例子中顯示一個(gè)簡單頁,該頁在運(yùn)行時(shí)顯示標(biāo)題新聞。該頁的主體包括Literal控件。

<body>

<form

runat="server">

<H1><asp:Literal

id="Headline"

runat=server

/></H1>

</form>

</body>

將代碼添加到Page_Load事件中以在運(yùn)行時(shí)設(shè)置控件的Text屬性。

private

void

Page_Load(object

sender,

System.EventArgs

e){

Headline.Text

=

"New

Web

Site

Announced";

}知識(shí)4用戶控件

1.用戶控件的概念

用戶控件是能夠被其他ASP.NETWeb窗體作為服務(wù)器控件導(dǎo)入的ASP.NET頁。類似于Web服務(wù)器控件(運(yùn)行在服務(wù)器上的組件),用戶控件提供了UI和其他相關(guān)的功能。當(dāng)創(chuàng)建好用戶控件之后,就可以在同一個(gè)Web應(yīng)用程序的其他頁面中使用它。

用戶控件是以

.ascx為文件擴(kuò)展名的ASP.NET頁。用戶控件使你能夠很容易劃分和重用通用UI功能,并將其用于你的各個(gè)ASP.NETWeb應(yīng)用程序中。與Web窗體類似,可以使用任何文本編輯器編寫這些控件,或者使用代碼隱藏類開發(fā)它們。此外,用戶控件也是在第一次請(qǐng)求時(shí)進(jìn)行編譯,然后存放在服務(wù)器內(nèi)存中以減少對(duì)后續(xù)請(qǐng)求的響應(yīng)時(shí)間。但是,與Web窗體不同的是,不能單獨(dú)請(qǐng)求用戶控件,它必須被包含在Web頁中才能正常運(yùn)行。

1)用戶控件的組成

用戶控件由HTML和代碼組成,但由于用戶控件是被Web窗體使用的,因此它們不包含<HEAD>、<BODY>或<FORM>等HTML標(biāo)記,而由每個(gè)使用用戶控件的Web窗體包含這些標(biāo)記。

當(dāng)Web窗體使用一個(gè)用戶控件時(shí),該用戶控件就參與了該Web窗體事件的生命周期。而且,因?yàn)橛脩艨丶且粋€(gè)ASP.NET頁,所以它擁有自己的頁面邏輯。例如,用戶控件可以在它的Page_Load事件過程中處理自己的回發(fā)功能。

2)用戶控件與關(guān)聯(lián)的代碼隱藏類

與Web窗體一樣,用戶控件也有一個(gè)與其相關(guān)聯(lián)的代碼隱藏類。@Page指令用來鏈接Web窗體中的代碼隱藏類文件,而@Control指令用來在用戶控件頁中引用代碼隱藏類文件。@Control指令僅能和用戶控件一起使用,且每個(gè)

.ascx文件中只能包含一個(gè)@Control指令。例如,為WebUserControl1的用戶控件引用某個(gè)代碼隱藏類,使用下面的@Control指令:

<%@ControlLanguage="C#"CodeFile="WebUserControl.ascx.cs"

AutoEventWireup="true"Inherits="WebUserControl"%>

3)用戶控件與Web服務(wù)器控件

用戶控件與Web服務(wù)器控件有所不同。Web服務(wù)器控件不僅包括窗體類型控件(如按鈕和文本框),而且包括特殊的控件,如日歷。

用戶控件一旦創(chuàng)建,就能在整個(gè)項(xiàng)目的Web窗體中使用。然而,因?yàn)闆]有將用戶控件編譯成程序集,所以與其他類型控件不同,它們存在下列限制:

·在每個(gè)使用控件的Web應(yīng)用程序中,都必須保存一個(gè)該控件的副本。

·無法在VisualStudio.NET工具箱中加載用戶控件,這樣,必須通過將控件從解決方案資源管理器拖放到Web窗體中來創(chuàng)建它們。

·Web窗體加載用戶控件后將其初始化,這意味著直到Web窗體的Page_Load事件發(fā)生后,才會(huì)更新用戶控件的屬性值。

2.使用用戶控件的原因

1)使用用戶控件的優(yōu)勢(shì)

用戶控件有多種用途,如創(chuàng)建標(biāo)題和導(dǎo)航條,以及在Web應(yīng)用程序項(xiàng)目中重復(fù)使用代碼塊。開發(fā)Web應(yīng)用程序時(shí)使用用戶控件有很多優(yōu)點(diǎn):

·用戶控件是自包含的。它們提供了單獨(dú)的變量命名空間,這意味著用戶控件的方法和屬性不會(huì)與宿主頁面中任何已存在的方法和屬性沖突。

·用戶控件可以在宿主頁面內(nèi)多次使用而不會(huì)引起屬性和方法的沖突。

·用戶控件和主宿主頁面的編寫語言可以不同。

2)共享用戶控件

單一的用戶控件可以由一個(gè)Web應(yīng)用程序的所有頁共享。然而,一個(gè)Web應(yīng)用程序中的

.aspx頁不能容納另外一個(gè)Web應(yīng)用程序中的用戶控件。要在多個(gè)Web應(yīng)用程序中使用同一個(gè)用戶控件,必須將其復(fù)制到每個(gè)Web應(yīng)用程序的虛擬根目錄下。

要在多個(gè)Web應(yīng)用程序中共享控件,也可以創(chuàng)建一個(gè)Web自定義控件,由其充當(dāng)可共享的用戶控件。Web自定義控件的創(chuàng)建比用戶控件的創(chuàng)建要困難得多。因?yàn)椋c用戶控件不同的是,Web自定義控件不能采用VisualStudio.NET的可視化工具創(chuàng)建,所有開發(fā)都由代碼來完成。

3.添加用戶控件

可以把一個(gè)用戶控件放在任何ASP.NETWeb窗體中。引用用戶控件的頁稱為宿主頁,控件包含在該宿主頁面中。

1)包含用戶控件

通過使用@Register指令,可以將用戶控件包含在ASP.NETWeb窗體中,代碼如下:

<%@Registersrc="WebUserControl.ascx"tagname="WebUserControl"

tagprefix="uc1"%>

TagPrefix屬性為用戶控件確定唯一的命名空間,因此可以區(qū)分多個(gè)同名的用戶控件。TagName屬性是用戶控件的唯一名稱。Src屬性表示用戶控件文件的虛擬路徑。

2)使用用戶控件

用@Register指令注冊(cè)用戶控件之后,可以像放置普通Web服務(wù)器控件那樣,在Web窗體中放置用戶控件標(biāo)記。下面的代碼把兩個(gè)用戶控件添加到一個(gè)Web窗體中:

<uc1:WebUserControlID="WebUserControl1"runat="server"/>

<uc1:WebUserControlID="WebUserControl2"runat="server"/>

當(dāng)請(qǐng)求主Web窗體時(shí),運(yùn)行庫編譯用戶控件文件,頁面就可以使用它。

3)使用GET和SET屬性

在宿主頁面的事件過程中,可以通過申明用戶控件來訪問其屬性。下面的代碼是聲明兩個(gè)用戶控件的示例:

protectedWebUserControlWebUserControl1;

protectedWebUserControlWebUserControl2;

在上面的代碼示例中,WebUserControl是實(shí)現(xiàn)用戶控件的類名。變量名(WebUserControl1或WebUserControl2)必須和向Web窗體中增加用戶控件時(shí)使用的ID屬性名相同。

下面的例子中調(diào)用了用戶控件WebUserControl1和WebUserControl2的GET屬性:

Label1.Text=(WebUserControl1.pNum+WebUserControl2.pNum).ToString();

下面的例子中調(diào)用用戶控件WebUserControl1和WebUserControl2的SET屬性,以在用戶控件中顯示常量5和7:

WebUserControl1.pNum=5;

WebUserControl2.pNum=7;

4.創(chuàng)建用戶控件

1)創(chuàng)建新的用戶控件

創(chuàng)建新的用戶控件的步驟如下:

①在VisualStudio.NET的解決方案資源管理器中,右擊某個(gè)Web應(yīng)用程序項(xiàng)目,指向“添加”,然后單擊“添加Web用戶控件”。

②為控件命名,然后單擊“打開”,這樣就創(chuàng)建了擴(kuò)展名是.ascx的頁。

③增加UI元素。就像創(chuàng)建ASP.NETWeb窗體一樣,創(chuàng)建一個(gè)頁面,從VisualStudio.NET的工具箱或是寫HTML來添加UI元素。④為UI元素和頁面事件添加事件過程和創(chuàng)建其他ASP.NET頁面類似,可將事件過程添加到代碼隱藏類。

⑤創(chuàng)建和宿主頁面交互的公共屬性。公共屬性允許宿主Web窗體讀寫用戶控件上的UI元素的值。

2)將現(xiàn)有的Web窗體轉(zhuǎn)換為用戶控件

①刪除所有<HTML>、<BODY>和<FORM>標(biāo)記。

②如果頁面中存在

@Page指令,把它修改成

@Control指令。雖然

@Control支持大多數(shù)的

@Page屬性,但仍須確認(rèn)沒有它不支持的屬性。

③為文件重命名,使該名稱能夠反映文件的用途,然后把文件的擴(kuò)展名從

.aspx修改成

.ascx。

3)宿主頁

宿主頁就是包含了用戶控件的Web窗體。這個(gè)頁應(yīng)當(dāng)用流布局,以避免用戶控件內(nèi)容和頁面內(nèi)容的重疊。

宿主頁不能直接訪問用戶控件的UI元素。當(dāng)使用用戶控件的公共屬性來公開控件的UI元素時(shí),可使宿主頁能夠使用UI元素。

例如,如果一個(gè)用戶控件包含一個(gè)文本框,就需要為這個(gè)文本框增加一個(gè)公共屬性,以便宿主頁能夠讀寫文本框中的值。以下代碼顯示的是包含一個(gè)文本框和兩個(gè)輸入驗(yàn)證控件的用戶控件的HTML部分:

<%@ControlLanguage="C#"AutoEventWireup="true"

CodeFile="WebUserControl.ascx.cs"Inherits="WebUserControl"%>

<asp:TextBoxID="txtNum"runat="server"></asp:TextBox>

<asp:RequiredFieldValidatorID="RequiredFieldValidator1"runat="server"

ControlToValidate="txtNum"ErrorMessage="youmustenteravalue">

</asp:RequiredFieldValidator>

<asp:RangeValidatorID="RangeValidator1"runat="server"

ControlToValidate="txtNum"

ErrorMessage="pleaseenteranumberbetween0and99"MaximumValue="99"

MinimumValue="0"Type="Integer">

</asp:RangeValidator>

要向宿主頁公開文本框的值,必須創(chuàng)建一個(gè)公共屬性。例如,在代碼隱藏類中的下列代碼創(chuàng)建了一個(gè)名為pNum的屬性。pNum屬性公開了用戶控件中該文本框控件的Text屬性。

publicintpNum{

get {

returnConvert.ToInt32(txtNum.Text);

}

Set {

txtNum.Text=Convert.ToString(value);

}

}

用戶控件的所有公共的變量、屬性和方法都可作為這個(gè)控件在宿主頁中的屬性和方法。在前面的示例中,可在宿主頁中將pNum屬性作為控件屬性來訪問。如果用戶控件名為userText1,則可以讀寫userText1.pNum屬性。同樣,如果在用戶控件中創(chuàng)建了一個(gè)公共方法,它就會(huì)變成宿主頁中所能使用的方法。

任務(wù)實(shí)現(xiàn)

步驟1打開校園在線超市ASP.NET網(wǎng)站,在“解決方案資源管理器”中打開“添加新項(xiàng)”對(duì)話框,在模板列表中選擇“Web用戶控件”,給出用戶控件的名稱為“Count.ascx”,如圖7-3所示。

圖7-3添加新項(xiàng)對(duì)話框步驟2在“Count.ascx”文件中添加Table標(biāo)簽、Label控件和Literal控件,并對(duì)所有控件和標(biāo)簽進(jìn)行屬性設(shè)置。其設(shè)計(jì)界面效果如圖7-4所示。

圖7-4“Count.ascx”文件設(shè)計(jì)界面顯示效果其對(duì)應(yīng)的HTML代碼如下,

<%@ControlLanguage="C#"AutoEventWireup="true"CodeFile="Count.ascx.cs"Inherits="Count"%>

<tablestyle="width:135px">

<tr>

<tdalign="center">

<asp:LabelID="Label1"runat="server"Text="當(dāng)前訪問人數(shù):">

</asp:Label>

<asp:LiteralID="Literal2"runat="server"Text="0">

</asp:Literal>

</td>

</tr>

<tr>

<tdalign="center">

<asp:LabelID="Label2"runat="server"Text="訪問總?cè)藬?shù):">

</asp:Label>

<asp:LiteralID="Literal1"runat="server"Text="0">

</asp:Literal>

</td>

</tr>

</table>步驟3在“解決方案資源管理器”中雙擊打開母版頁文件“MasterPage.master”,從“解決方案資源管理器”中拖入用戶控件文件“Count.ascx”放在指定的位置,如圖7-5所示。

圖7-5“MasterPage.master”文件局部設(shè)計(jì)界面顯示效果步驟4在“解決方案資源管理器”中打開“添加新項(xiàng)”對(duì)話框,在模板列表中選擇“全局應(yīng)用程序類”,名稱為

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論