NET是一個web開發平台,它提供了一個編程模型、一個全面的軟體基礎設施和爲PC和移動設備構建健壯的web應用程式所需的各種服務。
NET在HTTP協議的基礎上工作,使用HTTP命令和策略來設置瀏覽器以實現雙向通信和協作。
ASP.NET是Microsoft.NET平台的一部分。ASP.NET應用程式是編譯代碼,使用.NET框架中存在的可擴展和可重用組件或對象編寫。這些代碼可以使用.Net framework中類的整個層次結構。
ASP.NET應用程式代碼可以用以下任何語言編寫:
- C#
- Visual Basic.Net
- Jscript
- J#
ASP.NET用於在internet上生成交互式的、數據驅動的web應用程式。它由大量控制項組成,如文本框、按鈕和標籤,用於組裝、配置和操作代碼以創建HTML頁面。
ASP.NET Web Forms Model
NET web窗體將事件驅動的交互模型擴展到web應用程式。瀏覽器向web伺服器提交web表單,伺服器返回完整的標記頁或HTML頁作爲響應。
所有客戶端用戶活動都轉發到伺服器進行有狀態處理。伺服器處理客戶端操作的輸出並觸發響應。
現在,HTTP是一個無狀態協議。ASP.NET框架有助於存儲有關應用程式狀態的信息,這些信息包括:
- Page state
- Session state
頁面狀態是客戶端的狀態,即web表單中各種輸入欄位的內容。會話狀態是從用戶訪問和處理的各個頁面獲得的集合信息,即整個會話狀態。爲了澄清這個概念,讓我們以購物車爲例。
用戶將項目添加到購物車。項目是從一個頁面(比如項目頁面)中選擇的,而收集的項目總數和價格則顯示在另一個頁面(比如購物車頁面)中。只有HTTP無法跟蹤來自不同頁面的所有信息。ASP.NET會話狀態和伺服器端基礎結構跟蹤在會話中全局收集的信息。
在生成ASP.NET運行時代碼時,ASP.NET運行時跨頁請求在伺服器之間傳遞頁狀態,並在隱藏欄位中合併伺服器端組件的狀態。
這樣,伺服器就會了解整個應用程式的狀態,並以兩層連接的方式運行。
The ASP.NET Component Model
ASP.NET組件模型提供了ASP.NET頁面的各種構建塊。基本上它是一個對象模型,它描述了:
幾乎所有HTML元素或標記的伺服器端副本,如<表單>和<輸入>。
伺服器控制項,有助於開發複雜的用戶界面。例如,日曆控制項或Gridview控制項。
ASP.NET是一種技術,它在包含所有與web相關功能的.NET框架上工作。.Net框架由面向對象的層次結構組成。ASP.NET web應用程式由頁面組成。當用戶請求ASP.NET頁時,IIS將頁的處理委託給ASP.NET運行時系統。
ASP.NET運行時將.aspx頁轉換爲類的實例,該實例繼承自.NET框架的基類頁。因此,每個ASP.NET頁面都是一個對象,其所有組件(即伺服器端控制項)也是對象。
Components of .Net Framework 3.5
在開始下一個關於Visual Studio.Net的會話之前,讓我們先了解一下.Net framework 3.5的各個組件。下表描述了.Net framework 3.5的組件及其執行的作業:
Components and their Description |
---|
(1) 公共語言運行庫或CLR 它執行內存管理、異常處理、調試、安全檢查、線程執行、代碼執行、代碼安全、驗證和編譯。直接由CLR管理的代碼稱爲託管代碼。編譯託管代碼時,編譯器將原始碼轉換爲獨立於CPU的中間語言(IL)代碼。即時(Just-In-Time,JIT)編譯器將IL代碼編譯成本地代碼,這是CPU特有的。 |
它包含大量可重用類型庫。類、接口、結構和枚舉值,統稱爲類型。 |
(3) 通用語言規範 它包含.Net支持語言的規範和語言集成的實現。 |
(4) 普通型系統 它提供了在運行時聲明、使用和管理類型以及跨語言通信的指南。 |
元數據和程序集/b/b 元數據是描述程序的二進位信息,存儲在可移植可執行文件(PE)或內存中。程序集是一個邏輯單元,由程序集清單、類型元數據、IL代碼和一組資源(如圖像文件)組成。 |
(6) Windows窗體 Windows窗體包含應用程式中顯示的任何窗口的圖形表示。 |
(7) ASP.NET和ASP.NET AJAX NET是web開發模型,AJAX是ASP.NET的擴展,用於開發和實現AJAX功能。NET AJAX包含的組件允許開發人員在不完全重新加載頁面的情況下更新網站上的數據。 |
(8) ADO.NET 它是用於處理數據和資料庫的技術。它提供對數據源(如SQL server、OLE DB、XML等)的訪問。ADO.NET允許連接到數據源以檢索、操作和更新數據。 |
(9) Windows工作流基礎(WF) 它有助於在Windows中構建基於工作流的應用程式。它包含活動、工作流運行時、工作流設計器和規則引擎。 |
(10) Windows演示基礎 它提供了用戶界面和業務邏輯之間的分離。它有助於使用文檔、媒體、二維和三維圖形、動畫等開發視覺上令人驚嘆的界面。 |
(11) Windows通信基金會(WCF) 它是用於構建和執行連接系統的技術。 |
(12) Windows卡空間 它爲在internet上訪問資源和共享個人信息提供了安全性。 |
(()13)linq/b> 它使用類似於傳統查詢語言SQL的語法將數據查詢功能傳授給.Net語言。 |
ASP.NET - Environment Setup
NET在構建web應用程式的HTTP之上提供了一個抽象層。它在面向對象的範例中提供高級實體,如類和組件。
構建ASP.NET應用程式和前端的關鍵開發工具是Visual Studio。在本教程中,我們將使用Visual Studio 2008。
Visual Studio是一個用於編寫、編譯和調試代碼的集成開發環境。它提供了一套完整的開發工具,用於構建ASP.NET web應用程式、web服務、桌面應用程式和移動應用程式。
The Visual Studio IDE
「新建項目」窗口允許從可用模板中選擇應用程式模板。
當您啓動一個新網站時,ASP.NET提供了該網站的啓動文件夾和文件,包括該網站的第一個web表單的兩個文件。
名爲Default.aspx的文件包含定義窗體的HTML和asp代碼,名爲Default.aspx.cs(用於C#編碼)的文件或名爲Default.aspx.vb(用於vb編碼)的文件包含所選語言的代碼,此代碼負責在窗體上執行的操作。
Visual Studio IDE中的主窗口是Web窗體設計器窗口。其他支持窗口包括工具箱、解決方案資源管理器和屬性窗口。您可以使用設計器設計web窗體,將代碼添加到窗體上的控制項,以便窗體根據您的需要工作,您可以使用代碼編輯器。
Working with Views and Windows
您可以通過以下方式使用windows:
要將Web窗體設計器從一個視圖更改爲另一個視圖,請單擊「設計」或「源」按鈕。
若要關閉窗口,請單擊右上角的「關閉」按鈕,若要重新顯示,請從「視圖」菜單中選擇該窗口。
要隱藏窗口,請單擊其「自動隱藏」按鈕。然後窗口變爲選項卡。若要再次顯示,請再次單擊「自動隱藏」按鈕。
要更改窗口的大小,只需拖動它。
Adding Folders and Files to your Website
創建新的web表單時,Visual Studio會自動生成表單的起始HTML,並將其顯示在web表單設計器的源視圖中。解決方案資源管理器用於添加網站上的任何其他文件、文件夾或任何現有項目。
若要添加標準文件夾,請右鍵單擊要在解決方案資源管理器中添加該文件夾的項目或文件夾,然後選擇「新建文件夾」。
要添加ASP.NET文件夾,請右鍵單擊解決方案資源管理器中的項目,然後從列表中選擇該文件夾。
若要將現有項添加到網站,請右鍵單擊要在解決方案資源管理器中添加項的項目或文件夾,然後從對話框中選擇。
Projects and Solutions
典型的ASP.NET應用程式由許多項組成:web內容文件(.aspx)、源文件(.cs文件)、程序集(.dll和.exe文件)、數據源文件(.mdb文件)、引用、圖標、用戶控制項以及其他各種文件和文件夾。所有這些構成網站的文件都包含在一個解決方案中。
創建新網站時。VB2008會自動創建解決方案並在解決方案資源管理器中顯示它。
解決方案可能包含一個或多個項目。項目包含內容文件、源文件和其他文件,如數據源和圖像文件。通常,項目的內容作爲可執行文件(.exe)或動態連結庫(.dll)文件編譯到程序集中。
通常項目包含以下內容文件:
- Page file (.aspx)
- User control (.ascx)
- Web service (.asmx)
- Master page (.master)
- Site map (.sitemap)
- Website configuration file (.config)
Building and Running a Project
您可以通過以下方式執行應用程式:
- Selecting Start
- Selecting Start Without Debugging from the Debug menu,
- pressing F5
- Ctrl-F5
程序是生成的意思是,通過從「生成」菜單中選擇命令生成.exe或.dll文件。
ASP.NET - Life Cycle
ASP.NET生命周期指定,如何:
- ASP.NET processes pages to produce dynamic output
- The application and its pages are instantiated and processed
- ASP.NET compiles the pages dynamically
ASP.NET生命周期可以分爲兩組:
- Application Life Cycle
- Page Life Cycle
ASP.NET Application Life Cycle
應用程式生命周期有以下階段:
用戶請求訪問應用程式資源頁。瀏覽器將此請求發送到web伺服器。
統一管道接收第一個請求,並發生以下事件:
創建了類ApplicationManager的對象。
創建HostingEnvironment類的對象,以提供有關資源的信息。
將編譯應用程式中的頂級項。
將創建響應對象。創建並初始化應用程式對象,如HttpContext、HttpRequest和HttpResponse。
將創建HttpApplication對象的實例並將其分配給請求。
請求由HttpApplication類處理。這個類引發不同的事件來處理請求。
ASP.NET Page Life Cycle
當一個頁面被請求時,它被加載到伺服器內存中,進行處理並發送到瀏覽器。然後從內存中卸載。在每個步驟中,方法和事件都是可用的,可以根據應用程式的需要重寫這些方法和事件。換句話說,您可以編寫自己的代碼來覆蓋默認代碼。
Page類創建頁面上所有控制項的層次樹。頁面上的所有組件(指令除外)都是此控制項樹的一部分。通過向page指令添加trace=「true」,可以看到控制項樹。我們將在「指令」和「事件處理」下介紹頁指令和跟蹤。
頁面生命周期階段包括:
- Initialization
- Instantiation of the controls on the page
- Restoration and maintenance of the state
- Execution of the event handler codes
- Page rendering
理解頁面周期有助於編寫代碼,使某些特定的事情在頁面生命周期的任何階段發生。它還有助於編寫自定義控制項並在正確的時間初始化它們,用視圖狀態數據填充它們的屬性,以及運行控制項行爲代碼。
以下是ASP.NET頁的不同階段:
頁面請求-當ASP.NET收到頁面請求時,它決定是解析和編譯頁面,還是緩存頁面版本;相應地發送響應。
頁面生命周期開始-在此階段,將設置請求和響應對象。如果請求是舊請求或回發,則頁面的IsPostBack屬性設置爲true。頁面的UICulture屬性也已設置。
頁面初始化-在此階段,通過設置unique ID屬性爲頁面上的控制項分配唯一ID,並應用主題。對於新請求,將加載回發數據並將控制項屬性還原爲視圖狀態值。
頁面加載-在此階段,使用視圖狀態和控制項狀態值設置控制項屬性。
Validation-調用Validation控制項的Validate方法,在其成功執行時,頁的IsValid屬性設置爲true。
回發事件處理-如果請求是回發(舊請求),則調用相關的事件處理程序。
頁面呈現-在此階段,保存頁面和所有控制項的視圖狀態。頁面爲每個控制項調用呈現方法,呈現的輸出被寫入頁面響應屬性的OutputStream類。
Unload-呈現的頁面被發送到客戶端,頁面屬性(如Response和Request)被卸載並完成所有清理。
ASP.NET Page Life Cycle Events
在頁面生命周期的每個階段,頁面都會引發一些事件,這些事件可以進行編碼。事件處理程序基本上是一個函數或子例程,使用聲明性屬性(如Onclick或handle)綁定到事件。
以下是頁面生命周期事件:
PreInit-PreInit是頁面生命周期中的第一個事件。它檢查IsPostBack屬性並確定頁面是否爲回發。它設置主題和母版頁,創建動態控制項,獲取和設置配置文件屬性值。可以通過重載OnPreInit方法或創建頁PreInit處理程序來處理此事件。
Init-Init event初始化控制項屬性並生成控制項樹。此事件可以通過重載OnInit方法或創建頁面初始化處理程序來處理。
InitComplete-InitComplete事件允許跟蹤視圖狀態。所有控制項都啓用視圖狀態跟蹤。
LoadViewState-LoadViewState事件允許將視圖狀態信息加載到控制項中。
LoadPostData-在此階段,所有輸入欄位的內容都是用<form>標記定義的。
預加載-預加載發生在控制項中加載回發數據之前。可以通過重載OnPreLoad方法或創建頁面預加載處理程序來處理此事件。
加載-首先爲頁引發加載事件,然後爲所有子控制項遞歸引發加載事件。將創建控制項樹中的控制項。可以通過重載OnLoad方法或創建頁面加載處理程序來處理此事件。
LoadComplete-加載過程完成,控制事件處理程序運行,並進行頁驗證。此事件可以通過重載OnLoadComplete方法或創建頁LoadComplete處理程序來處理
PreRender-PreRender事件發生在呈現輸出之前。通過處理此事件,頁面和控制項可以在呈現輸出之前執行任何更新。
PreRenderComplete-由於對所有子控制項遞歸觸發PreRender事件,此事件確保預呈現階段的完成。
SaveStateComplete-保存頁面上的控制狀態。保存個性化、控制狀態和視圖狀態信息。生成HTML標記。可以通過重寫呈現方法或創建頁面呈現處理程序來處理此階段。
卸載階段是頁面生命周期的最後階段。它遞歸地引發所有控制項的卸載事件,最後引發頁面本身的卸載事件。最終清理完成,所有資源和引用(如資料庫連接)都被釋放。可以通過修改OnUnLoad方法或創建頁面卸載處理程序來處理此事件。
ASP.NET - First Example
一個ASP.NET頁面由許多伺服器控制項以及HTML控制項、文本和圖像組成。頁中的敏感數據和頁上不同控制項的狀態存儲在構成該頁請求上下文的隱藏欄位中。
NET運行時控制頁實例與其狀態之間的關聯。ASP.NET頁是該頁的對象或從中繼承的對象。
頁面上的所有控制項也是從父控制項類繼承的相關控制項類的對象。運行頁時,將創建對象頁的實例及其所有內容控制項。
ASP.NET頁也是以.aspx擴展名保存的伺服器端文件。它本質上是模塊化的,可分爲以下核心部分:
- Page Directives
- Code Section
- Page Layout
Page Directives
頁面指令設置頁面運行的環境。@Page指令定義ASP.NET頁分析器和編譯器使用的頁特定屬性。頁面指令指定如何處理頁面,以及需要對頁面進行哪些假設。
它允許導入命名空間、加載程序集以及使用自定義標記名和命名空間前綴註冊新控制項。
Code Section
代碼部分提供頁面和控制項事件的處理程序以及所需的其他函數。我們提到,ASP.NET遵循一個對象模型。現在,這些對象在用戶界面上發生某些事件時引發事件,如用戶單擊按鈕或移動光標。這些事件需要進行響應的類型在事件處理程序函數中進行編碼。事件處理程序只是綁定到控制項的函數。
代碼部分或代碼隱藏文件提供了所有這些事件處理程序例程以及開發人員使用的其他函數。頁代碼可以預編譯並以二進位程序集的形式部署。
Page Layout
頁面布局提供頁面的界面。它包含伺服器控制項、文本、內聯JavaScript和HTML標記。
下面的代碼片段提供了一個示例ASP.NET頁面,解釋用C#編寫的頁面指令、代碼節和頁面布局:
<!-- directives --> <% @Page Language="C#" %> <!-- code section --> <script runat="server"> private void convertoupper(object sender, EventArgs e) { string str = mytext.Value; changed_text.InnerHtml = str.ToUpper(); } </script> <!-- Layout --> <html> <head> <title> Change to Upper Case </title> </head> <body> <h3> Conversion to Upper Case </h3> <form runat="server"> <input runat="server" id="mytext" type="text" /> <input runat="server" id="button1" type="submit" value="Enter..." On伺服器Click="convertoupper"/> <hr /> <h3> Results: </h3> <span runat="server" id="changed_text" /> </form> </body> </html>
將此文件複製到web伺服器根目錄。通常是c:\ iNETput\wwwroot。從瀏覽器中打開文件以執行它,它將生成以下結果:
Using Visual Studio IDE
讓我們使用Visual Studio IDE開發相同的示例。您只需將控制項拖到「設計」視圖中,而不必鍵入代碼:
內容文件是自動開發的。您只需要添加一個按鈕1_Click例程,如下所示:
protected void Button1_Click(object sender, EventArgs e) { string buf = TextBox1.Text; changed_text.InnerHtml = buf.ToUpper(); }
內容文件代碼如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="firstexample._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Untitled Page </title> </head> <body> <form id="form1" runat="server"> <div> <asp:TextBox ID="TextBox1" runat="server" style="width:224px"> </asp:TextBox> <br /> <br /> <asp:Button ID="Button1" runat="server" Text="Enter..." style="width:85px" onclick="Button1_Click" /> <hr /> <h3> Results: </h3> <span runat="server" id="changed_text" /> </div> </form> </body> </html>
在設計視圖上單擊滑鼠右鍵,然後從彈出菜單中選擇「在瀏覽器中查看」,即可執行該示例。這將生成以下結果:
ASP.NET - Event Handling
What is an Event?
事件是一個動作或事件,例如滑鼠單擊、按鍵、滑鼠移動或任何系統生成的通知。進程通過事件進行通信。例如,中斷是系統生成的事件。當事件發生時,應用程式應該能夠響應並管理它。
ASP.NET中的事件在客戶端計算機上引發,並在伺服器計算機上處理。例如,用戶單擊瀏覽器中顯示的按鈕。引發單擊事件。瀏覽器通過將此客戶端事件發布到伺服器來處理它。
伺服器有一個子例程,用於描述引發事件時要執行的操作;它稱爲事件處理程序。因此,當事件消息傳輸到伺服器時,它會檢查Click事件是否有關聯的事件處理程序。如果有,則執行事件處理程序。
Event Arguments
ASP.NET事件處理程序通常接受兩個參數並返回void。第一個參數表示引發事件的對象,第二個參數是事件參數。
事件的一般語法爲:
private void EventName (object sender, EventArgs e);
Application and Session Events
最重要的應用程式事件是:
應用程式啓動-當應用程式/網站啓動時會引發此問題。
應用程式結束-當應用程式/網站停止時會引發此問題。
類似地,最常用的會話事件是:
Session_Start-當用戶第一次從應用程式請求頁面時引發。
session=U end/b>-it is raised when the session ends.
Page and Control Events
常見的頁面和控制項事件包括:
數據綁定-當控制項綁定到數據源時引發。
已釋放-當釋放頁面或控制項時會引發此問題。
錯誤-這是一個頁事件,在引發未處理的異常時發生。
Init-在初始化頁或控制項時引發。
加載-在加載頁或控制項時引發。
PreRender-當要呈現頁面或控制項時,它會被引發。
卸載-從內存中卸載頁或控制項時會引發此問題。
Event Handling Using Controls
所有的ASP.NET控制項都是作爲類實現的,它們都有一些事件,當用戶對它們執行某個操作時,這些事件就會被觸發。例如,當用戶單擊按鈕時,將生成「Click」事件。對於處理事件,有內置屬性和事件處理程序。對事件處理程序進行編碼以響應事件,並對其採取適當的操作。
默認情況下,Visual Studio通過在子過程中包含Handles子句來創建事件處理程序。此子句命名過程處理的控制項和事件。
按鈕控制項的ASP標記:
<asp:Button ID="btnCancel" runat="server" Text="Cancel" />
單擊事件的事件處理程序:
Protected Sub btnCancel_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnCancel.Click End Sub
事件也可以不使用Handles子句進行編碼。然後,必須根據控制項的適當事件屬性命名處理程序。
按鈕控制項的ASP標記:
<asp:Button ID="btnCancel" runat="server" Text="Cancel" Onclick="btnCancel_Click" />
單擊事件的事件處理程序:
Protected Sub btnCancel_Click(ByVal sender As Object, ByVal e As System.EventArgs) End Sub
常見的控制事件有:
Event | Attribute | Controls |
---|---|---|
Click | OnClick | Button, image button, link button, image map |
Command | OnCommand | Button, image button, link button |
TextChanged | OnTextChanged | Text box |
SelectedIndexChanged | OnSelectedIndexChanged | Drop-down list, list box, radio button list, check box list. |
CheckedChanged | OnCheckedChanged | Check box, radio button |
有些事件會導致表單立即回發到伺服器,這些事件稱爲回發事件。例如,單擊事件,如Button.click。
有些事件不會立即回發到伺服器,這些事件稱爲非回發事件。
例如,更改事件或選擇事件,如TextBox.TextChanged或CheckBox.CheckedChanged。通過將非post back事件的AutoPostBack屬性設置爲true,可以使其立即回發。
Default Events
頁面對象的默認事件是加載事件。類似地,每個控制項都有一個默認事件。例如,button控制項的默認事件是Click事件。
可以在Visual Studio中創建默認事件處理程序,只需雙擊「設計」視圖中的控制項即可。下表顯示了常用控制項的一些默認事件:
Control | Default Event |
---|---|
AdRotator | AdCreated |
BulletedList | Click |
Button | Click |
Calender | SelectionChanged |
CheckBox | CheckedChanged |
CheckBoxList | SelectedIndexChanged |
DataGrid | SelectedIndexChanged |
DataList | SelectedIndexChanged |
DropDownList | SelectedIndexChanged |
HyperLink | Click |
ImageButton | Click |
ImageMap | Click |
LinkButton | Click |
ListBox | SelectedIndexChanged |
Menu | MenuItemClick |
RadioButton | CheckedChanged |
RadioButtonList | SelectedIndexChanged |
Example
這個例子包括一個簡單的頁面,上面有一個標籤控制項和一個按鈕控制項。當頁面事件(如頁面加載、頁面初始化、頁面預呈現等)發生時,它會發送一條消息,由label控制項顯示。單擊按鈕時,將引發按鈕單擊事件,該事件還會發送一條要顯示在標籤上的消息。
創建一個新網站,並從「控制項」工具箱中拖動標籤控制項和按鈕控制項。使用「屬性」窗口,將控制項的ID設置爲.lblmessage。還有,btnclick。分別是。將按鈕控制項的文本屬性設置爲「單擊」。
標記文件(.aspx):
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="eventdemo._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Untitled Page</title> </head> <body> <form id="form1" runat="server"> <div> <asp:Label ID="lblmessage" runat="server" > </asp:Label> <br /> <br /> <br /> <asp:Button ID="btnclick" runat="server" Text="Click" onclick="btnclick_Click" /> </div> </form> </body> </html>
雙擊「設計」視圖以移動到代碼隱藏文件。頁面加載事件是自動創建的,其中沒有任何代碼。寫下以下代碼行:
using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; namespace eventdemo { public partial class _Default : System.Web.UI.Page{ protected void Page_Load(object sender, EventArgs e) { lblmessage.Text += "Page load event handled. <br />"; if (Page.IsPostBack) { lblmessage.Text += "Page post back event handled.<br/>"; } } protected void Page_Init(object sender, EventArgs e){ lblmessage.Text += "Page initialization event handled.<br/>"; } protected void Page_PreRender(object sender, EventArgs e) { lblmessage.Text += "Page prerender event handled. <br/>"; } protected void btnclick_Click(object sender, EventArgs e) { lblmessage.Text += "Button click event handled. <br/>"; } } }
執行頁面。標籤顯示頁面加載、頁面初始化和頁面預呈現事件。單擊按鈕查看效果:
ASP.NET - 伺服器 Side
我們研究了頁面生命周期以及頁面如何包含各種控制項。頁面本身被實例化爲一個控制項對象。所有web窗體基本上都是ASP.NET頁類的實例。page類具有與內部對象相對應的以下非常有用的屬性:
- Session
- Application
- Cache
- Request
- Response
- 伺服器
- User
- Trace
我們將在適當的時候討論每一個目標。在本教程中,我們將探討伺服器對象、請求對象和響應對象。
伺服器 Object
Asp.NET中的伺服器對象是System.Web.Http伺服器Utility類的實例。Http伺服器Utility類提供了許多屬性和方法來執行各種作業。
Properties and Methods of the 伺服器 object
Http伺服器Utility類的方法和屬性通過ASP.NET提供的內部伺服器對象公開。
下表提供了屬性列表:
Property | Description |
---|---|
MachineName | Name of server computer |
ScriptTimeOut | Gets and sets the request time-out value in seconds. |
下表列出了一些重要的方法:
Method | Description |
---|---|
CreateObject(String) | Creates an instance of the COM object identified by its ProgID (Programmatic ID). |
CreateObject(Type) | Creates an instance of the COM object identified by its Type. |
Equals(Object) | Determines whether the specified Object is equal to the current Object. |
Execute(String) | Executes the handler for the specified virtual path in the context of the current request. |
Execute(String, Boolean) | Executes the handler for the specified virtual path in the context of the current request and specifies whether to clear the QueryString and Form collections. |
GetLastError | Returns the previous exception. |
GetType | Gets the Type of the current instance. |
HtmlEncode | Changes an ordinary string into a string with legal HTML characters. |
HtmlDecode | Converts an Html string into an ordinary string. |
ToString | Returns a String that represents the current Object. |
Transfer(String) | For the current request, terminates execution of the current page and starts execution of a new page by using the specified URL path of the page. |
UrlDecode | Converts an URL string into an ordinary string. |
UrlEncodeToken | Works same as UrlEncode, but on a byte array that contains Base64-encoded data. |
UrlDecodeToken | Works same as UrlDecode, but on a byte array that contains Base64-encoded data. |
MapPath | Return the physical path that corresponds to a specified virtual file path on the server. |
Transfer | Transfers execution to another web page in the current application. |
Request Object
請求對象是System.Web.HttpRequest類的實例。它表示將頁面加載到瀏覽器中的HTTP請求的值和屬性。
此對象所呈現的信息由更高級別的抽象(web控制項模型)包裝。但是,此對象有助於檢查某些信息,如客戶端瀏覽器和cookies。
Properties and Methods of the Request Object
下表提供了請求對象的一些值得注意的屬性:
Property | Description |
---|---|
AcceptTypes | Gets a string array of client-supported MIME accept types. |
ApplicationPath | Gets the ASP.NET application's virtual application root path on the server. |
瀏覽器 | Gets or sets information about the requesting client's browser capabilities. |
ContentEncoding | Gets or sets the character set of the entity-body. |
ContentLength | Specifies the length, in bytes, of content sent by the client. |
ContentType | Gets or sets the MIME content type of the incoming request. |
Cookies | Gets a collection of cookies sent by the client. |
FilePath | Gets the virtual path of the current request. |
Files | Gets the collection of files uploaded by the client, in multipart MIME format. |
Form | Gets a collection of form variables. |
Headers | Gets a collection of HTTP headers. |
HttpMethod | Gets the HTTP data transfer method (such as GET, POST, or HEAD) used by the client. |
InputStream | Gets the contents of the incoming HTTP entity body. |
IsSecureConnection | Gets a value indicating whether the HTTP connection uses secure sockets (that is, HTTPS). |
QueryString | Gets the collection of HTTP query string variables. |
RawUrl | Gets the raw URL of the current request. |
RequestType | Gets or sets the HTTP data transfer method (GET or POST) used by the client. |
伺服器Variables | Gets a collection of Web server variables. |
TotalBytes | Gets the number of bytes in the current input stream. |
Url | Gets information about the URL of the current request. |
UrlReferrer | Gets information about the URL of the client's previous request that is linked to the current URL. |
UserAgent | Gets the raw user agent string of the client browser. |
UserHostAddress | Gets the IP host address of the remote client. |
UserHostName | Gets the DNS name of the remote client. |
UserLanguages | Gets a sorted string array of client language preferences. |
下表列出了一些重要的方法:
Method | Description |
---|---|
BinaryRead | Performs a binary read of a specified number of bytes from the current input stream. |
Equals(Object) | Determines whether the specified object is equal to the current object. (Inherited from object.) |
GetType | Gets the Type of the current instance. |
MapImageCoordinates | Maps an incoming image-field form parameter to appropriate x-coordinate and y-coordinate values. |
MapPath(String) | Maps the specified virtual path to a physical path. |
SaveAs | Saves an HTTP request to disk. |
ToString | Returns a String that represents the current object. |
ValidateInput | Causes validation to occur for the collections accessed through the Cookies, Form, and QueryString properties. |
Response Object
Response對象表示伺服器對客戶端請求的響應。它是System.Web.HttpResponse類的一個實例。
在ASP.NET中,響應對象在向客戶端發送HTML文本方面沒有任何重要作用,因爲伺服器端控制項具有嵌套的、面向對象的方法來呈現它們自己。
然而,HttpResponse對象仍然提供一些重要的功能,比如cookie特性和Redirect()方法。Response.Redirect()方法允許將用戶轉移到應用程式內外的另一個頁面。它需要往返旅行。
Properties and Methods of the Response Object
下表提供了響應對象的一些值得注意的屬性:
Property | Description |
---|---|
Buffer | Gets or sets a value indicating whether to buffer the output and send it after the complete response is finished processing. |
BufferOutput | Gets or sets a value indicating whether to buffer the output and send it after the complete page is finished processing. |
Charset | Gets or sets the HTTP character set of the output stream. |
ContentEncoding | Gets or sets the HTTP character set of the output stream. |
ContentType | Gets or sets the HTTP MIME type of the output stream. |
Cookies | Gets the response cookie collection. |
Expires | Gets or sets the number of minutes before a page cached on a browser expires. |
ExpiresAbsolute | Gets or sets the absolute date and time at which to remove cached information from the cache. |
HeaderEncoding | Gets or sets an encoding object that represents the encoding for the current header output stream. |
Headers | Gets the collection of response headers. |
Is顧客Connected | Gets a value indicating whether the client is still connected to the server. |
Output | Enables output of text to the outgoing HTTP response stream. |
OutputStream | Enables binary output to the outgoing HTTP content body. |
RedirectLocation | Gets or sets the value of the Http Location header. |
Status | Sets the status line that is returned to the client. |
StatusCode | Gets or sets the HTTP status code of the output returned to the client. |
StatusDescription | Gets or sets the HTTP status string of the output returned to the client. |
SubStatusCode | Gets or sets a value qualifying the status code of the response. |
SuppressContent | Gets or sets a value indicating whether to send HTTP content to the client. |
下表列出了一些重要的方法:
Method | Description |
---|---|
AddHeader | Adds an HTTP header to the output stream. AddHeader is provided for compatibility with earlier versions of ASP. |
AppendCookie | Infrastructure adds an HTTP cookie to the intrinsic cookie collection. |
AppendHeader | Adds an HTTP header to the output stream. |
AppendToLog | Adds custom log information to the InterNET Information Services (IIS) log file. |
BinaryWrite | Writes a string of binary characters to the HTTP output stream. |
ClearContent | Clears all content output from the buffer stream. |
Close | Closes the socket connection to a client. |
End | Sends all currently buffered output to the client, stops execution of the page, and raises the EndRequest event. |
Equals(Object) | Determines whether the specified object is equal to the current object. |
Flush | Sends all currently buffered output to the client. |
GetType | Gets the Type of the current instance. |
Pics | Appends a HTTP PICS-Label header to the output stream. |
Redirect(String) | Redirects a request to a new URL and specifies the new URL. |
Redirect(String, Boolean) | Redirects a client to a new URL. Specifies the new URL and whether execution of the current page should terminate. |
SetCookie | Updates an existing cookie in the cookie collection. |
ToString | Returns a String that represents the current Object. |
TransmitFile(String) | Writes the specified file directly to an HTTP response output stream, without buffering it in memory. |
Write(Char) | Writes a character to an HTTP response output stream. |
Write(Object) | Writes an object to an HTTP response stream. |
Write(String) | Writes a string to an HTTP response output stream. |
WriteFile(String) | Writes the contents of the specified file directly to an HTTP response output stream as a file block. |
WriteFile(String, Boolean) | Writes the contents of the specified file directly to an HTTP response output stream as a memory block. |
Example
下面的簡單示例有一個文本框控制項,用戶可以在其中輸入名稱,一個按鈕將信息發送到伺服器,一個標籤控制項顯示客戶端計算機的URL。
內容文件:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="server_side._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Untitled Page</title> </head> <body> <form id="form1" runat="server"> <div> Enter your name:<br /> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Submit" /> <br /> <asp:Label ID="Label1" runat="server"/> </div> </form> </body> </html>
「代碼隱藏」按鈕單擊:
protected void Button1_Click(object sender, EventArgs e) { if (!String.IsNullOrEmpty(TextBox1.Text)) { // Access the Http伺服器Utility methods through // the intrinsic 伺服器 object. Label1.Text = "Welcome, " + 伺服器.HtmlEncode(TextBox1.Text) + ".<br/> The url is " + 伺服器.UrlEncode(Request.Url.ToString()) } }
運行該頁可查看以下結果:
ASP.NET - 伺服器 Controls
控制項是圖形用戶界面的小型構建塊,其中包括文本框、按鈕、複選框、列表框、標籤和許多其他工具。使用這些工具,用戶可以輸入數據、進行選擇並指示他們的首選項。
控制項還用於結構作業,如驗證、數據訪問、安全性、創建母版頁和數據操作。
ASP.NET使用五種類型的web控制項,它們是:
- HTML controls
- HTML 伺服器 controls
- ASP.NET 伺服器 controls
- ASP.NET Ajax 伺服器 controls
- User controls and custom controls
ASP.NET伺服器控制項是ASP.NET中使用的主要控制項。這些控制項可以分爲以下類別:
驗證控制項—這些控制項用於驗證用戶輸入,它們通過運行客戶端腳本來工作。
數據源控制項-這些控制項提供到不同數據源的數據綁定。
數據視圖控制項-它們是各種列表和表,可以綁定到數據源中的數據以供顯示。
個性化設置控制項-這些控制項用於根據用戶首選項根據用戶信息對頁面進行個性化設置。
登錄和安全控制-這些控制提供用戶身份驗證。
母版頁-這些控制項在整個應用程式中提供一致的布局和界面。
導航控制項-這些控制項有助於導航。例如,菜單、樹視圖等。
豐富的控制項-這些控制項實現特殊功能。例如,AdRotator、FileUpload和Calendar控制項。
使用伺服器控制項的語法爲:
<asp:controlType ID ="ControlID" runat="server" Property1=value1 [Property2=value2] />
此外,visual studio還具有以下功能,可幫助生成無錯誤編碼:
- Dragging and dropping of controls in design view
- IntelliSense feature that displays and auto-completes the properties
- The properties window to set the property values directly
Properties of the 伺服器 Controls
具有可視方面的ASP.NET伺服器控制項派生自WebControl類,並繼承該類的所有屬性、事件和方法。
Web Control類本身和其他一些未可視化呈現的伺服器控制項是從System.Web.UI.Control類派生的。例如,占位符控制項或XML控制項。
ASP.Net伺服器控制項繼承WebControl和System.Web.UI.Control類的所有屬性、事件和方法。
下表顯示了所有伺服器控制項通用的繼承屬性:
Property | Description |
---|---|
AccessKey | Pressing this key with the Alt key moves focus to the control. |
Attributes | It is the collection of arbitrary attributes (for rendering only) that do not correspond to properties on the control. |
BackColor | Background color. |
BindingContainer | The control that contains this control's data binding. |
BorderColor | Border color. |
BorderStyle | Border style. |
BorderWidth | Border width. |
CausesValidation | Indicates if it causes validation. |
ChildControlCreated | It indicates whether the server control's child controls have been created. |
顧客ID | Control ID for HTML markup. |
Context | The HttpContext object associated with the server control. |
Controls | Collection of all controls contained within the control. |
ControlStyle | The style of the Web server control. |
CssClass | CSS class |
DataItemContainer | Gets a reference to the naming container if the naming container implements IDataItemContainer. |
DataKeysContainer | Gets a reference to the naming container if the naming container implements IDataKeysControl. |
DesignMode | It indicates whether the control is being used on a design surface. |
DisabledCssClass | Gets or sets the CSS class to apply to the rendered HTML element when the control is disabled. |
Enabled | Indicates whether the control is grayed out. |
EnableTheming | Indicates whether theming applies to the control. |
EnableViewState | Indicates whether the view state of the control is maintained. |
Events | Gets a list of event handler delegates for the control. |
Font | Font. |
Forecolor | Foreground color. |
HasAttributes | Indicates whether the control has attributes set. |
HasChildViewState | Indicates whether the current server control's child controls have any saved view-state settings. |
Height | Height in pixels or %. |
ID | Identifier for the control. |
IsChildControlStateCleared | Indicates whether controls contained within this control have control state. |
IsEnabled | Gets a value indicating whether the control is enabled. |
IsTrackingViewState | It indicates whether the server control is saving changes to its view state. |
IsViewStateEnabled | It indicates whether view state is enabled for this control. |
LoadViewStateById | It indicates whether the control participates in loading its view state by ID instead of index. |
Page | Page containing the control. |
Parent | Parent control. |
RenderingCompatibility | It specifies the ASP.NET version that the rendered HTML will be compatible with. |
Site | The container that hosts the current control when rendered on a design surface. |
SkinID | Gets or sets the skin to apply to the control. |
Style | Gets a collection of text attributes that will be rendered as a style attribute on the outer tag of the Web server control. |
TabIndex | Gets or sets the tab index of the Web server control. |
TagKey | Gets the HtmlTextWriterTag value that corresponds to this Web server control. |
TagName | Gets the name of the control tag. |
TemplateControl | The template that contains this control. |
TemplateSourceDirectory | Gets the virtual directory of the page or control containing this control. |
ToolTip | Gets or sets the text displayed when the mouse pointer hovers over the web server control. |
UniqueID | Unique identifier. |
ViewState | Gets a dictionary of state information that saves and restores the view state of a server control across multiple requests for the same page. |
ViewStateIgnoreCase | It indicates whether the StateBag object is case-insensitive. |
ViewStateMode | Gets or sets the view-state mode of this control. |
Visible | It indicates whether a server control is visible. |
Width | Gets or sets the width of the Web server control. |
Methods of the 伺服器 Controls
下表提供了伺服器控制項的方法:
Method | Description |
---|---|
AddAttributesToRender | Adds HTML attributes and styles that need to be rendered to the specified HtmlTextWriterTag. |
AddedControl | Called after a child control is added to the Controls collection of the control object. |
AddParsedSubObject | Notifies the server control that an element, either XML or HTML, was parsed, and adds the element to the server control's control collection. |
ApplyStyleSheetSkin | Applies the style properties defined in the page style sheet to the control. |
ClearCached顧客ID | Infrastructure. Sets the cached 顧客ID value to null. |
ClearChildControlState | Deletes the control-state information for the server control's child controls. |
ClearChildState | Deletes the view-state and control-state information for all the server control's child controls. |
ClearChildViewState | Deletes the view-state information for all the server control's child controls. |
CreateChildControls | Used in creating child controls. |
CreateControlCollection | Creates a new ControlCollection object to hold the child controls. |
CreateControlStyle | Creates the style object that is used to implement all style related properties. |
DataBind | Binds a data source to the server control and all its child controls. |
DataBind(Boolean) | Binds a data source to the server control and all its child controls with an option to raise the DataBinding event. |
DataBindChildren | Binds a data source to the server control's child controls. |
Dispose | Enables a server control to perform final clean up before it is released from memory. |
EnsureChildControls | Determines whether the server control contains child controls. If it does not, it creates child controls. |
EnsureID | Creates an identifier for controls that do not have an identifier. |
Equals(Object) | Determines whether the specified object is equal to the current object. |
Finalize | Allows an object to attempt to free resources and perform other cleanup operations before the object is reclaimed by garbage collection. |
FindControl(String) | Searches the current naming container for a server control with the specified id parameter. |
FindControl(String, Int32) | Searches the current naming container for a server control with the specified id and an integer. |
Focus | Sets input focus to a control. |
GetDesignModeState | Gets design-time data for a control. |
GetType | Gets the type of the current instance. |
GetUniqueIDRelativeTo | Returns the prefixed portion of the UniqueID property of the specified control. |
HasControls | Determines if the server control contains any child controls. |
HasEvents | Indicates whether events are registered for the control or any child controls. |
IsLiteralContent | Determines if the server control holds only literal content. |
LoadControlState | Restores control-state information. |
LoadViewState | Restores view-state information. |
MapPathSecure | Retrieves the physical path that a virtual path, either absolute or relative, maps to. |
MemberwiseClone | Creates a shallow copy of the current object. |
MergeStyle | Copies any nonblank elements of the specified style to the web control, but does not overwrite any existing style elements of the control. |
OnBubbleEvent | Determines whether the event for the server control is passed up the page's UI server control hierarchy. |
OnDataBinding | Raises the data binding event. |
OnInit | Raises the Init event. |
OnLoad | Raises the Load event. |
OnPreRender | Raises the PreRender event. |
OnUnload | Raises the Unload event. |
OpenFile | Gets a Stream used to read a file. |
RemovedControl | Called after a child control is removed from the controls collection of the control object. |
Render | Renders the control to the specified HTML writer. |
RenderBeginTag | Renders the HTML opening tag of the control to the specified writer. |
RenderChildren | Outputs the contents of a server control's children to a provided HtmlTextWriter object, which writes the contents to be rendered on the client. |
RenderContents | Renders the contents of the control to the specified writer. |
RenderControl(HtmlTextWriter) | Outputs server control content to a provided HtmlTextWriter object and stores tracing information about the control if tracing is enabled. |
RenderEndTag | Renders the HTML closing tag of the control into the specified writer. |
ResolveAdapter | Gets the control adapter responsible for rendering the specified control. |
SaveControlState | Saves any server control state changes that have occurred since the time the page was posted back to the server. |
SaveViewState | Saves any state that was modified after the TrackViewState method was invoked. |
SetDesignModeState | Sets design-time data for a control. |
ToString | Returns a string that represents the current object. |
TrackViewState | Causes the control to track changes to its view state so that they can be stored in the object's view state property. |
Example
讓我們看看一個特定的伺服器控制項-樹狀視圖控制項。樹視圖控制項位於導航控制項下。其他導航控制項有:菜單控制項和站點映射路徑控制項。
在頁面上添加樹視圖控制項。選擇編輯節點。。。從任務中。使用樹狀圖節點編輯器編輯每個節點,如圖所示:
創建節點後,在「設計」視圖中如下所示:
自動套用格式。。。任務允許您設置樹狀圖的格式,如下所示:
在頁面上添加一個label控制項和一個文本框控制項,並分別將它們命名爲lblmessage和txtmessage。
編寫幾行代碼,以確保選中特定節點時,label控制項顯示節點文本,文本框顯示其下的所有子節點(如果有)。文件後面的代碼應該如下所示:
using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; namespace eventdemo { public partial class treeviewdemo : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { txtmessage.Text = " "; } protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e) { txtmessage.Text = " "; lblmessage.Text = "Selected node changed to: " + TreeView1.SelectedNode.Text; TreeNodeCollection childnodes = TreeView1.SelectedNode.ChildNodes; if(childnodes != null) { txtmessage.Text = " "; foreach (TreeNode t in childnodes) { txtmessage.Text += t.Value; } } } } }
執行頁面以查看效果。您將能夠展開和摺疊節點。
ASP.NET - HTML 伺服器
HTML伺服器控制項基本上是標準的HTML控制項,經過增強後可以進行伺服器端處理。諸如頭標記、錨標記和輸入元素等HTML控制項不由伺服器處理,而是發送到瀏覽器進行顯示。
通過添加屬性runat=「server」和添加id屬性使它們可用於伺服器端處理,可以將它們專門轉換爲伺服器控制項。
例如,考慮HTML輸入控制項:
<input type="text" size="40">
可以通過添加runat和id屬性將其轉換爲伺服器控制項:
<input type="text" id="testtext" size="40" runat="server">
Advantages of using HTML 伺服器 Controls
儘管ASP.NET伺服器控制項可以執行HTML伺服器控制項完成的所有作業,但在以下情況下,後面的控制項很有用:
- Using static tables for layout purposes.
- Converting a HTML page to run under ASP.NET
下表描述了HTML伺服器控制項:
Control Name | HTML tag |
---|---|
HtmlHead | <head>element |
HtmlInputButton | <input type=button|submit|reset> |
HtmlInputCheckbox | <input type=checkbox> |
HtmlInputFile | <input type = file> |
HtmlInputHidden | <input type = hidden> |
HtmlInputImage | <input type = image> |
HtmlInputPassword | <input type = password> |
HtmlInputRadioButton | <input type = radio> |
HtmlInputReset | <input type = reset> |
HtmlText | <input type = text|password> |
HtmlImage | <img> element |
HtmlLink | <link> element |
HtmlAnchor | <a> element |
HtmlButton | <button> element |
HtmlButton | <button> element |
HtmlForm | <form> element |
HtmlTable | <table> element |
HtmlTableCell | <td> and <th> |
HtmlTableRow | <tr> element |
HtmlTitle | <title> element |
HtmlSelect | <select&t; element |
HtmlGenericControl | All HTML controls not listed |
Example
下面的示例使用一個基本的HTML表進行布局。它使用一些框來獲取用戶的輸入,如姓名、地址、城市、州等。它還有一個按鈕控制項,單擊該控制項可獲取顯示在表最後一行的用戶數據。
在「設計」視圖中,頁面應如下所示:
內容頁的代碼顯示了使用HTML表元素進行布局。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="htmlserver._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Untitled Page</title> <style type="text/css"> .style1 { width: 156px; } .style2 { width: 332px; } </style> </head> <body> <form id="form1" runat="server"> <div> <table style="width: 54%;"> <tr> <td class="style1">Name:</td> <td class="style2"> <asp:TextBox ID="txtname" runat="server" style="width:230px"> </asp:TextBox> </td> </tr> <tr> <td class="style1">Street</td> <td class="style2"> <asp:TextBox ID="txtstreet" runat="server" style="width:230px"> </asp:TextBox> </td> </tr> <tr> <td class="style1">City</td> <td class="style2"> <asp:TextBox ID="txtcity" runat="server" style="width:230px"> </asp:TextBox> </td> </tr> <tr> <td class="style1">State</td> <td class="style2"> <asp:TextBox ID="txtstate" runat="server" style="width:230px"> </asp:TextBox> </td> </tr> <tr> <td class="style1"> </td> <td class="style2"></td> </tr> <tr> <td class="style1"></td> <td ID="displayrow" runat ="server" class="style2"> </td> </tr> </table> </div> <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Click" /> </form> </body> </html>
按鈕控制項後面的代碼:
protected void Button1_Click(object sender, EventArgs e) { string str = ""; str += txtname.Text + "<br />"; str += txtstreet.Text + "<br />"; str += txtcity.Text + "<br />"; str += txtstate.Text + "<br />"; displayrow.InnerHtml = str; }
注意以下事項:
標準的HTML標記已用於頁面布局。
HTML表的最後一行用於數據顯示。它需要伺服器端處理,因此一個ID屬性和runat屬性被添加到其中。
ASP.NET - 顧客 Side
ASP.NET客戶端編碼有兩個方面:
客戶端腳本:它在瀏覽器上運行,從而加快頁面的執行速度。例如,客戶端數據驗證,它可以捕獲無效數據並相應地警告用戶,而不必往返於伺服器。
客戶端原始碼:ASP.NET頁生成此項。例如,ASP.NET頁面的HTML原始碼包含許多隱藏欄位和自動注入的JavaScript代碼塊,這些代碼塊保存視圖狀態等信息或執行其他任務以使頁面正常工作。
顧客 Side Scripts
所有ASP.NET伺服器控制項都允許調用使用JavaScript或VBScript編寫的客戶端代碼。一些ASP.NET伺服器控制項使用客戶端腳本向用戶提供響應,而不發回伺服器。例如,驗證控制項。
除了這些腳本之外,Button控制項還有一個On顧客Click屬性,它允許在單擊按鈕時執行客戶端腳本。
傳統和伺服器HTML控制項具有以下事件,可以在引發時執行腳本:
Event | Description |
---|---|
onblur | When the control loses focus |
onfocus | When the control receives focus |
onclick | When the control is clicked |
onchange | When the value of the control changes |
onkeydown | When the user presses a key |
onkeypress | When the user presses an alphanumeric key |
onkeyup | When the user releases a key |
onmouseover | When the user moves the mouse pointer over the control |
onserverclick | It raises the 伺服器Click event of the control, when the control is clicked |
顧客 Side Source Code
我們已經討論過,ASP.NET頁面通常用兩個文件編寫:
- The content file or the markup file ( .aspx)
- The code-behind file
內容文件包含HTML或ASP.NET控制項標記和構成頁面結構的文本。代碼隱藏文件包含類定義。在運行時,內容文件被解析並轉換爲頁面類。
這個類連同代碼文件中的類定義和系統生成的代碼一起生成可執行代碼(程序集),用於處理所有已發布的數據、生成響應並將其發送回客戶端。
考慮一下簡單的頁面:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="clientside._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Untitled Page </title> </head> <body> <form id="form1" runat="server"> <div> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Click" /> </div> <hr /> <h3><asp:Label ID="Msg" runat="server" Text=""></asp:Label> </h3> </form> </body> </html>
在瀏覽器上運行此頁時,「查看原始碼」選項將顯示由ASP.Net運行時發送到瀏覽器的HTML頁:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title> Untitled Page </title> </head> <body> <form name="form1" method="post" action="Default.aspx" id="form1"> <div> <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTU5MTA2ODYwOWRk31NudGDgvhhA7joJum9Qn5RxU2M=" /> </div> <div> <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAwKpjZj0DALs0bLrBgKM54rGBhHsyM61rraxE+KnBTCS8cd1QDJ/"/> </div> <div> <input name="TextBox1" type="text" id="TextBox1" /> <input type="submit" name="Button1" value="Click" id="Button1" /> </div> <hr /> <h3><span id="Msg"></span></h3> </form> </body> </html>
如果正確瀏覽代碼,可以看到前兩個<div>標記包含存儲視圖狀態和驗證信息的隱藏欄位。
ASP.NET - Basic Controls
在本章中,我們將討論ASP.NET中可用的基本控制項。
Button Controls
ASP.NET提供三種類型的按鈕控制項:
按鈕:它在矩形區域內顯示文本。
它顯示創建爲超連結的文本。
圖像按鈕:顯示圖像。
當用戶單擊一個按鈕時,會引發兩個事件:Click和Command。
按鈕控制項的基本語法:
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Click" / >
按鈕控制項的公共屬性:
Property | Description |
---|---|
Text | The text displayed on the button. This is for button and link button controls only. |
ImageUrl | For image button control only. The image to be displayed for the button. |
AlternateText | For image button control only. The text to be displayed if the browser cannot display the image. |
CausesValidation | Determines whether page validation occurs when a user clicks the button. The default is true. |
CommandName | A string value that is passed to the command event when a user clicks the button. |
CommandArgument | A string value that is passed to the command event when a user clicks the button. |
PostBackUrl | The URL of the page that is requested when the user clicks the button. |
Text Boxes and Labels
文本框控制項通常用於接受用戶的輸入。文本框控制項可以接受一行或多行文本,具體取決於TextMode屬性的設置。
標籤控制項提供了一種簡單的顯示文本的方法,文本可以從頁面的一次執行更改爲下一次執行。如果要顯示不更改的文本,請使用文本。
文本控制項的基本語法:
<asp:TextBox ID="txtstate" runat="server" ></asp:TextBox>
文本框和標籤的常見屬性:
Property | Description |
---|---|
TextMode | Specifies the type of text box. SingleLine creates a standard text box, MultiLIne creates a text box that accepts more than one line of text and the Password causes the characters that are entered to be masked. The default is SingleLine. |
Text | The text content of the text box. |
MaxLength | The maximum number of characters that can be entered into the text box. |
Wrap | It determines whether or not text wraps automatically for multi-line text box; default is true. |
ReadOnly | Determines whether the user can change the text in the box; default is false, i.e., the user can not change the text. |
Columns | The width of the text box in characters. The actual width is determined based on the font that is used for the text entry. |
Rows | The height of a multi-line text box in lines. The default value is 0, means a single line text box. |
label控制項最常用的屬性是「Text」,它表示標籤上顯示的文本。
Check Boxes and Radio Buttons
複選框顯示用戶可以選中或取消選中的單個選項,單選按鈕顯示一組選項,用戶可以從中僅選擇一個選項。
要創建一組單選按鈕,請爲組中每個單選按鈕的group name屬性指定相同的名稱。如果一個表單中需要多個組,則爲每個組指定不同的組名。
如果希望在最初顯示窗體時選中複選框或單選按鈕,請將其選中屬性設置爲true。如果一個組中的多個單選按鈕的Checked屬性設置爲true,則只有最後一個被視爲true。
複選框的基本語法:
<asp:CheckBox ID= "chkoption" runat= "伺服器"> </asp:CheckBox>
單選按鈕的基本語法:
<asp:RadioButton ID= "rdboption" runat= "伺服器"> </asp: RadioButton>
複選框和單選按鈕的常見屬性:
Property | Description |
---|---|
Text | The text displayed next to the check box or radio button. |
Checked | Specifies whether it is selected or not, default is false. |
GroupName | Name of the group the control belongs to. |
List Controls
ASP.NET提供以下控制項
- Drop-down list,
- List box,
- Radio button list,
- Check box list,
- Bulleted list.
這些控制項允許用戶從列表中選擇一個或多個項。列表框和下拉列表包含一個或多個列表項。這些列表可以通過代碼或ListItemCollection編輯器加載。
列表框控制項的基本語法:
<asp:ListBox ID="ListBox1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="ListBox1_SelectedIndexChanged"> </asp:ListBox>
下拉列表控制項的基本語法:
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged"> </asp:DropDownList>
列表框和下拉列表的常見屬性:
Property | Description |
---|---|
Items | The collection of ListItem objects that represents the items in the control. This property returns an object of type ListItemCollection. |
Rows | Specifies the number of items displayed in the box. If actual list contains more rows than displayed then a scroll bar is added. |
SelectedIndex | The index of the currently selected item. If more than one item is selected, then the index of the first selected item. If no item is selected, the value of this property is -1. |
SelectedValue | The value of the currently selected item. If more than one item is selected, then the value of the first selected item. If no item is selected, the value of this property is an empty string (""). |
SelectionMode | Indicates whether a list box allows single selections or multiple selections. |
每個列表項對象的公共屬性:
Property | Description |
---|---|
Text | The text displayed for the item. |
Selected | Indicates whether the item is selected. |
Value | A string value associated with the item. |
需要注意的是:
若要使用下拉列表或列表框中的項,請使用控制項的「項」屬性。此屬性返回包含列表中所有項的ListItemCollection對象。
當用戶從下拉列表或列表框中選擇其他項時,將引發SelectedIndexChanged事件。
The ListItemCollection
ListItem collection對象是ListItem對象的集合。每個list item對象表示列表中的一個項。ListItemCollection中的項從0開始編號。
當使用諸如:lstcolor.items.Add(「Blue」)之類的字符串將項加載到列表框中時,列表項的文本和值屬性都將設置爲指定的字符串值。若要進行不同的設置,必須創建列表項對象,然後將該項添加到集合中。
ListItemCollection編輯器用於將項添加到下拉列表或列表框中。這用於創建項目的靜態列表。若要顯示集合編輯器,請從智能標記菜單中選擇「編輯項目」,或選擇控制項,然後在「屬性」窗口中的「項目」屬性中單擊省略號按鈕。
ListItemCollection的公共屬性:
Property | Description |
---|---|
Item(integer) | A ListItem object that represents the item at the specified index. |
Count | The number of items in the collection. |
ListItemCollection的常用方法:
Methods | Description |
---|---|
Add(string) | Adds a new item at the end of the collection and assigns the string parameter to the Text property of the item. |
Add(ListItem) | Adds a new item at the end of the collection. |
Insert(integer, string) | Inserts an item at the specified index location in the collection, and assigns string parameter to the text property of the item. |
Insert(integer, ListItem) | Inserts the item at the specified index location in the collection. |
Remove(string) | Removes the item with the text value same as the string. |
Remove(ListItem) | Removes the specified item. |
RemoveAt(integer) | Removes the item at the specified index as the integer. |
Clear | Removes all the items of the collection. |
FindByValue(string) | Returns the item whose value is same as the string. |
FindByValue(Text) | Returns the item whose text is same as the string. |
Radio Button list and Check Box list
單選按鈕列表顯示互斥選項的列表。複選框列表顯示獨立選項的列表。這些控制項包含可以通過控制項的Items屬性引用的ListItem對象的集合。
單選按鈕列表的基本語法:
<asp:RadioButtonList ID="RadioButtonList1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="RadioButtonList1_SelectedIndexChanged"> </asp:RadioButtonList>
複選框列表的基本語法:
<asp:CheckBoxList ID="CheckBoxList1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="CheckBoxList1_SelectedIndexChanged"> </asp:CheckBoxList>
複選框和單選按鈕列表的常見屬性:
Property | Description |
---|---|
RepeatLayout | This attribute specifies whether the table tags or the normal html flow to use while formatting the list when it is rendered. The default is Table. |
RepeatDirection | It specifies the direction in which the controls to be repeated. The values available are Horizontal and Vertical. Default is Vertical. |
RepeatColumns | It specifies the number of columns to use when repeating the controls; default is 0. |
Bulleted lists and Numbered lists
項目符號列表控制項創建項目符號列表或編號列表。這些控制項包含可以通過控制項的Items屬性引用的ListItem對象的集合。
項目符號列表的基本語法:
<asp:BulletedList ID="BulletedList1" runat="server"> </asp:BulletedList>
項目符號列表的常見屬性:
Property | Description |
---|---|
BulletStyle | This property specifies the style and looks of the bullets, or numbers. |
RepeatDirection | It specifies the direction in which the controls to be repeated. The values available are Horizontal and Vertical. Default is Vertical. |
RepeatColumns | It specifies the number of columns to use when repeating the controls; default is 0. |
HyperLink Control
超連結控制項類似於HTML<a>元素。
超連結控制項的基本語法:
<asp:HyperLink ID="HyperLink1" runat="server"> HyperLink </asp:HyperLink>
它具有以下重要特性:
Property | Description |
---|---|
ImageUrl | Path of the image to be displayed by the control. |
NavigateUrl | Target link URL. |
Text | The text to be displayed as the link. |
Target | The window or frame which loads the linked page. |
Image Control
圖像控制項用於在網頁上顯示圖像,或者在圖像不可用時顯示其他文本。
圖像控制項的基本語法:
<asp:Image ID="Image1" runat="server">
它具有以下重要特性:
Property | Description |
---|---|
AlternateText | Alternate text to be displayed in absence of the image. |
ImageAlign | Alignment options for the control. |
ImageUrl | Path of the image to be displayed by the control. |
ASP.NET - Directives
NET指令是指定可選設置(如註冊自定義控制項和頁面語言)的指令。這些設置描述.Net框架如何處理web窗體(.aspx)或用戶控制項(.ascx)頁。
聲明指令的語法爲:
<%@ directive_name attribute=value [attribute=value] %>
在本節中,我們將只介紹ASP.NET指令,並在整個教程中使用這些指令中的大部分。
The Application Directive
Application指令定義特定於應用程式的屬性。它位於global.aspx文件的頂部。
應用程式指令的基本語法是:
<%@ Application Language="C#" %>
應用程式指令的屬性是:
Attributes | Description |
---|---|
Inherits | The name of the class from which to inherit. |
Description | The text description of the application. Parsers and compilers ignore this. |
Language | The language used in code blocks. |
The Assembly Directive
Assembly指令在分析時將程序集連結到頁面或應用程式。這可以出現在global.asax文件中用於應用程式範圍的連結,也可以出現在頁面文件中用於連結到頁面或用戶控制項的用戶控制項文件中。
彙編指令的基本語法是:
<%@ Assembly Name ="myassembly" %>
Assembly指令的屬性是:
Attributes | Description |
---|---|
Name | The name of the assembly to be linked. |
Src | The path to the source file to be linked and compiled dynamically. |
The Control Directive
control指令與用戶控制項一起使用,並顯示在用戶控制項(.ascx)文件中。
控制指令的基本語法是:
<%@ Control Language="C#" EnableViewState="false" %>
控制指令的屬性是:
Attributes | Description |
---|---|
AutoEventWireup | The Boolean value that enables or disables automatic association of events to handlers. |
ClassName | The file name for the control. |
Debug | The Boolean value that enables or disables compiling with debug symbols. |
Description | The text description of the control page, ignored by compiler. |
EnableViewState | The Boolean value that indicates whether view state is maintained across page requests. |
Explicit | For VB language, tells the compiler to use option explicit mode. |
Inherits | The class from which the control page inherits. |
Language | The language for code and script. |
Src | The filename for the code-behind class. |
Strict | For VB language, tells the compiler to use the option strict mode. |
The Implements Directive
Implement指令指示網頁、母版頁或用戶控制項頁必須實現指定的.Net framework接口。
implements指令的基本語法是:
<%@ Implements Interface="interface_name" %>
The Import Directive
Import指令將命名空間導入到應用程式的web頁、用戶控制頁中。如果在global.asax文件中指定了Import指令,則它將應用於整個應用程式。如果它位於用戶控制項頁的某個頁中,則應用於該頁或控制項。
import指令的基本語法是:
<%@ namespace="System.Drawing" %>
The Master Directive
Master指令指定頁文件作爲主頁。
母版頁指令示例的基本語法爲:
<%@ MasterPage Language="C#" AutoEventWireup="true" CodeFile="SiteMater.master.cs" Inherits="SiteMaster" %>
The MasterType Directive
MasterType指令爲頁的Master屬性指定類名,使其成爲強類型。
MasterType指令的基本語法是:
<%@ MasterType attribute="value"[attribute="value" ...] %>
The OutputCache Directive
OutputCache指令控制網頁或用戶控制項的輸出緩存策略。
OutputCache指令的基本語法是:
<%@ OutputCache Duration="15" VaryByParam="無" %>
The Page Directive
Page指令爲頁面解析器和編譯器定義特定於頁面文件的屬性。
Page指令的基本語法是:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Trace="true" %>
Page指令的屬性是:
Attributes | Description |
---|---|
AutoEventWireup | The Boolean value that enables or disables page events that are being automatically bound to methods; for example, Page_Load. |
Buffer | The Boolean value that enables or disables HTTP response buffering. |
ClassName | The class name for the page. |
顧客Target | The browser for which the server controls should render content. |
CodeFile | The name of the code behind file. |
Debug | The Boolean value that enables or disables compilation with debug symbols. |
Description | The text description of the page, ignored by the parser. |
EnableSessionState | It enables, disables, or makes session state read-only. |
EnableViewState | The Boolean value that enables or disables view state across page requests. |
ErrorPage | URL for redirection if an unhandled page exception occurs. |
Inherits | The name of the code behind or other class. |
Language | The programming language for code. |
Src | The file name of the code behind class. |
Trace | It enables or disables tracing. |
TraceMode | It indicates how trace messages are displayed, and sorted by time or category. |
Transaction | It indicates if transactions are supported. |
ValidateRequest | The Boolean value that indicates whether all input data is validated against a hardcoded list of values. |
The PreviousPageType Directive
PreviousPageType指令爲頁分配一個類,以便頁是強類型的。
PreviousPagetype指令示例的基本語法爲:
<%@ PreviousPageType attribute="value"[attribute="value" ...] %>
The Reference Directive
Reference指令指示應編譯另一頁或用戶控制項並將其連結到當前頁。
Reference指令的基本語法是:
<%@ Reference Page ="somepage.aspx" %>
The Register Directive
Register派生用於註冊自定義伺服器控制項和用戶控制項。
Register指令的基本語法是:
<%@ Register Src="~/footer.ascx" TagName="footer" TagPrefix="Tfooter" %>
ASP.NET - Managing State
超文本傳輸協議(HTTP)是一種無狀態協議。當客戶端與伺服器斷開連接時,ASP.NET引擎將丟棄頁對象。這樣,每個web應用程式都可以擴展到同時服務多個請求,而不會耗盡伺服器內存。
然而,需要一些技術來存儲請求之間的信息,並在需要時檢索它。此信息,即當前會話中當前用戶的所有控制項和變量的當前值,稱爲狀態。
ASP.NET管理四種狀態:
- View State
- Control State
- Session State
- Application State
View State
視圖狀態是頁面及其所有控制項的狀態。它是由ASP.NET框架跨帖子自動維護的。
將頁發送回客戶端時,將確定頁及其控制項的屬性更改,並將其存儲在名爲「VIEWSTATE」的隱藏輸入欄位的值中。當頁面再次被發回時,_VIEWSTATE欄位將與HTTP請求一起發送到伺服器。
視圖狀態可以啓用或禁用:
通過在web.config文件的<pages>部分設置EnableViewState屬性,整個應用程式。
通過將page指令的EnableViewState屬性設置爲<%@page Language=「C 35;」EnableViewState=「false」%>
通過設置control.EnableViewState屬性的控制項。
它使用由定義視圖狀態項集合的StateBag類定義的視圖狀態對象來實現。狀態包是一個包含屬性-值對的數據結構,存儲爲與對象關聯的字符串。
StateBag類具有以下屬性:
Properties | Description |
---|---|
Item(name) | The value of the view state item with the specified name. This is the default property of the StateBag class. |
Count | The number of items in the view state collection. |
Keys | Collection of keys for all the items in the collection. |
Values | Collection of values for all the items in the collection. |
StateBag類有以下方法:
Methods | Description |
---|---|
Add(name, value) | Adds an item to the view state collection and existing item is updated. |
Clear | Removes all the items from the collection. |
Equals(Object) | Determines whether the specified object is equal to the current object. |
Finalize | Allows it to free resources and perform other cleanup operations. |
GetEnumerator | Returns an enumerator that iterates over all the key/value pairs of the StateItem objects stored in the StateBag object. |
GetType | Gets the type of the current instance. |
IsItemDirty | Checks a StateItem object stored in the StateBag object to evaluate whether it has been modified. |
Remove(name) | Removes the specified item. |
SetDirty | Sets the state of the StateBag object as well as the Dirty property of each of the StateItem objects contained by it. |
SetItemDirty | Sets the Dirty property for the specified StateItem object in the StateBag object. |
ToString | Returns a string representing the state bag object. |
Example
下面的示例演示了存儲視圖狀態的概念。讓我們保留一個計數器,每次通過單擊頁面上的按鈕發回頁面時計數器都會遞增。label控制項顯示計數器中的值。
標記文件代碼如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="statedemo._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Untitled Page </title> </head> <body> <form id="form1" runat="server"> <div> <h3>View State demo</h3> Page Counter: <asp:Label ID="lblCounter" runat="server" /> <asp:Button ID="btnIncrement" runat="server" Text="Add Count" onclick="btnIncrement_Click" /> </div> </form> </body> </html>
示例的代碼隱藏文件如下所示:
public partial class _Default : System.Web.UI.Page { public int counter { get { if (ViewState["pcounter"] != null) { return ((int)ViewState["pcounter"]); } else { return 0; } } set { ViewState["pcounter"] = value; } } protected void Page_Load(object sender, EventArgs e) { lblCounter.Text = counter.ToString(); counter++; } }
它將產生以下結果:
Control State
不能修改、直接訪問或禁用控制項狀態。
Session State
當用戶連接到ASP.NET網站時,將創建新的會話對象。當會話狀態打開時,將爲每個新請求創建一個新的會話狀態對象。此會話狀態對象成爲上下文的一部分,可通過頁面使用。
會話狀態通常用於存儲應用程式數據,如庫存、供應商列表、客戶記錄或購物車。它還可以保存有關用戶及其首選項的信息,並跟蹤掛起的操作。
會話通過120位SessionID進行標識和跟蹤,SessionID從客戶端傳遞到伺服器,然後作爲cookie或修改後的URL返回。SessionID是全局唯一和隨機的。
會話狀態對象是從HttpSessionState類創建的,該類定義會話狀態項的集合。
HttpSessionState類具有以下屬性:
Properties | Description |
---|---|
SessionID | The unique session identifier. |
Item(name) | The value of the session state item with the specified name. This is the default property of the HttpSessionState class. |
Count | The number of items in the session state collection. |
TimeOut | Gets and sets the amount of time, in minutes, allowed between requests before the session-state provider terminates the session. |
HttpSessionState類具有以下方法:
Methods | Description |
---|---|
Add(name, value) | Adds an item to the session state collection. |
Clear | Removes all the items from session state collection. |
Remove(name) | Removes the specified item from the session state collection. |
RemoveAll | Removes all keys and values from the session-state collection. |
RemoveAt | Deletes an item at a specified index from the session-state collection. |
會話狀態對象是一個名稱-值對,用於存儲和檢索會話狀態對象中的某些信息。您也可以使用以下代碼:
void StoreSessionInfo() { String fromuser = TextBox1.Text; Session["fromuser"] = fromuser; } void RetrieveSessionInfo() { String fromuser = Session["fromuser"]; Label1.Text = fromuser; }
上面的代碼只在會話字典對象中存儲字符串,但是,它可以存儲所有原始數據類型和由原始數據類型組成的數組,以及數據集、數據表、哈希表和圖像對象,以及從ISerializable對象繼承的任何用戶定義類。
Example
下面的示例演示了存儲會話狀態的概念。頁面上有兩個按鈕,一個用於輸入字符串的文本框和一個用於顯示上次會話中存儲的文本的標籤。
標記文件代碼如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Untitled Page </title> </head> <body> <form id="form1" runat="server"> <div> <table style="width: 568px; height: 103px"> <tr> <td style="width: 209px"> <asp:Label ID="lblstr" runat="server" Text="Enter a String" style="width:94px"> </asp:Label> </td> <td style="width: 317px"> <asp:TextBox ID="txtstr" runat="server" style="width:227px"> </asp:TextBox> </td> </tr> <tr> <td style="width: 209px"></td> <td style="width: 317px"></td> </tr> <tr> <td style="width: 209px"> <asp:Button ID="btnnrm" runat="server" Text="No action button" style="width:128px" /> </td> <td style="width: 317px"> <asp:Button ID="btnstr" runat="server" OnClick="btnstr_Click" Text="Submit the String" /> </td> </tr> <tr> <td style="width: 209px"> </td> <td style="width: 317px"> </td> </tr> <tr> <td style="width: 209px"> <asp:Label ID="lblsession" runat="server" style="width:231px" > </asp:Label> </td> <td style="width: 317px"> </td> </tr> <tr> <td style="width: 209px"> <asp:Label ID="lblshstr" runat="server"> </asp:Label> </td> <td style="width: 317px"> </td> </tr> </table> </div> </form> </body> </html>
在設計視圖中應該如下所示:
代碼隱藏文件如下:
public partial class _Default : System.Web.UI.Page { String mystr; protected void Page_Load(object sender, EventArgs e) { this.lblshstr.Text = this.mystr; this.lblsession.Text = (String)this.Session["str"]; } protected void btnstr_Click(object sender, EventArgs e) { this.mystr = this.txtstr.Text; this.Session["str"] = this.txtstr.Text; this.lblshstr.Text = this.mystr; this.lblsession.Text = (String)this.Session["str"]; } }
執行文件並觀察其工作原理:
Application State
ASP.NET應用程式是web伺服器上單個虛擬目錄中所有網頁、代碼和其他文件的集合。當信息以應用程式狀態存儲時,所有用戶都可以使用它。
爲了提供應用程式狀態的使用,ASP.NET從HTTPApplicationState類爲每個應用程式創建一個應用程式狀態對象,並將該對象存儲在伺服器內存中。此對象由類文件global.asax表示。
應用程式狀態主要用於存儲命中計數器和其他統計數據,全局應用程式數據,如稅率、折扣率等,並跟蹤訪問站點的用戶。
HttpApplicationState類具有以下屬性:
Properties | Description |
---|---|
Item(name) | The value of the application state item with the specified name. This is the default property of the HttpApplicationState class. |
Count | The number of items in the application state collection. |
HttpApplicationState類具有以下方法:
Methods | Description |
---|---|
Add(name, value) | Adds an item to the application state collection. |
Clear | Removes all the items from the application state collection. |
Remove(name) | Removes the specified item from the application state collection. |
RemoveAll | Removes all objects from an HttpApplicationState collection. |
RemoveAt | Removes an HttpApplicationState object from a collection by index. |
Lock() | Locks the application state collection so only the current user can access it. |
Unlock() | Unlocks the application state collection so all the users can access it. |
應用程式狀態數據通常通過爲事件編寫處理程序來維護:
- Application_Start
- Application_End
- Application_Error
- Session_Start
- Session_End
以下代碼段顯示了存儲應用程式狀態信息的基本語法:
Void Application_Start(object sender, EventArgs e) { Application["startMessage"] = "The application has started."; } Void Application_End(object sender, EventArgs e) { Application["endtMessage"] = "The application has ended."; }
ASP.NET - Validators
NET驗證控制項驗證用戶輸入的數據,以確保不存儲無用的、未經驗證的或矛盾的數據。
ASP.NET提供以下驗證控制項:
- RequiredFieldValidator
- RangeValidator
- CompareValidator
- RegularExpressionValidator
- CustomValidator
- ValidationSummary
BaseValidator Class
驗證控制項類繼承自BaseValidator類,因此它們繼承其屬性和方法。因此,查看這個基類的屬性和方法會有幫助,這些屬性和方法對於所有驗證控制項都是通用的:
Members | Description |
---|---|
ControlToValidate | Indicates the input control to validate. |
Display | Indicates how the error message is shown. |
Enable顧客Script | Indicates whether client side validation will take. |
Enabled | Enables or disables the validator. |
ErrorMessage | Indicates error string. |
Text | Error text to be shown if validation fails. |
IsValid | Indicates whether the value of the control is valid. |
SetFocusOnError | It indicates whether in case of an invalid control, the focus should switch to the related input control. |
ValidationGroup | The logical group of multiple validators, where this control belongs. |
Validate() | This method revalidates the control and updates the IsValid property. |
RequiredFieldValidator Control
RequiredFieldValidator控制項確保RequiredField不爲空。它通常綁定到文本框以強制輸入到文本框中。
控制項的語法如下所示:
<asp:RequiredFieldValidator ID="rfvcandidate" runat="server" ControlToValidate ="ddlcandidate" ErrorMessage="Please choose a candidate" InitialValue="Please choose a candidate"> </asp:RequiredFieldValidator>
RangeValidator Control
RangeValidator控制項驗證輸入值是否在預定範圍內。
它有三個特定的屬性:
Properties | Description |
---|---|
Type | It defines the type of the data. The available values are: Currency, Date, Double, Integer, and String. |
MinimumValue | It specifies the minimum value of the range. |
MaximumValue | It specifies the maximum value of the range. |
控制項的語法如下所示:
<asp:RangeValidator ID="rvclass" runat="server" ControlToValidate="txtclass" ErrorMessage="Enter your class (6 - 12)" MaximumValue="12" MinimumValue="6" Type="Integer"> </asp:RangeValidator>
CompareValidator Control
CompareValidator控制項將一個控制項中的值與固定值或另一個控制項中的值進行比較。
它具有以下特定屬性:
Properties | Description |
---|---|
Type | It specifies the data type. |
ControlToCompare | It specifies the value of the input control to compare with. |
ValueToCompare | It specifies the constant value to compare with. |
Operator | It specifies the comparison operator, the available values are: Equal, NotEqual, GreaterThan, GreaterThanEqual, LessThan, LessThanEqual, and DataTypeCheck. |
控制項的基本語法如下:
<asp:CompareValidator ID="CompareValidator1" runat="server" ErrorMessage="CompareValidator"> </asp:CompareValidator>
RegularExpressionValidator
RegularExpressionValidator允許通過與正則表達式的模式匹配來驗證輸入文本。正則表達式在ValidationExpression屬性中設置。
下表總結了正則表達式常用的語法結構:
Character Escapes | Description |
---|---|
\b | Matches a backspace. |
\t | Matches a tab. |
\r | Matches a carriage return. |
\v | Matches a vertical tab. |
\f | Matches a form feed. |
\n | Matches a new line. |
\ | Escape character. |
除了單字符匹配外,還可以指定一類可以匹配的字符,稱爲元字符。
Metacharacters | Description |
---|---|
. | Matches any character except \n. |
[abcd] | Matches any character in the set. |
[^abcd] | Excludes any character in the set. |
[2-7a-mA-M] | Matches any character specified in the range. |
\w | Matches any alphanumeric character and underscore. |
\W | Matches any non-word character. |
\s | Matches whitespace characters like, space, tab, new line etc. |
\S | Matches any non-whitespace character. |
\d | Matches any decimal character. |
\D | Matches any non-decimal character. |
可以添加量詞來指定字符出現的次數。
Quantifier | Description |
---|---|
* | Zero or more matches. |
+ | One or more matches. |
? | Zero or one matches. |
{N} | N matches. |
{N,} | N or more matches. |
{N,M} | Between N and M matches. |
控制項的語法如下所示:
<asp:RegularExpressionValidator ID="string" runat="server" ErrorMessage="string" ValidationExpression="string" ValidationGroup="string"> </asp:RegularExpressionValidator>
CustomValidator
CustomValidator控制項允許爲客戶端和伺服器端驗證編寫特定於應用程式的自定義驗證例程。
客戶端驗證通過顧客ValidationFunction屬性完成。客戶端驗證例程應使用腳本語言編寫,例如瀏覽器可以理解的JavaScript或VBScript。
必須從控制項的伺服器Validate事件處理程序調用伺服器端驗證例程。伺服器端驗證例程應使用任何.Net語言編寫,如C#或VB.Net。
控制項的基本語法如下所示:
<asp:CustomValidator ID="CustomValidator1" runat="server" 顧客ValidationFunction=.cvf_func. ErrorMessage="CustomValidator"> </asp:CustomValidator>
ValidationSummary
ValidationSummary控制項不執行任何驗證,但顯示頁面中所有錯誤的摘要。摘要顯示驗證失敗的所有驗證控制項的ErrorMessage屬性的值。
以下兩個相互包含的屬性列出了錯誤消息:
ShowSummary:以指定格式顯示錯誤消息。
ShowMessageBox:在單獨的窗口中顯示錯誤消息。
控制項的語法如下所示:
<asp:ValidationSummary ID="ValidationSummary1" runat="server" DisplayMode = "BulletList" ShowSummary = "true" HeaderText="Errors:" />
Validation Groups
複雜的頁面在不同的面板中提供不同的信息組。在這種情況下,可能需要爲單獨的組單獨執行驗證。這種情況是使用驗證組處理的。
要創建驗證組,應通過設置輸入控制項和驗證控制項的validation group屬性,將它們放入同一邏輯組中。
Example
下面的例子描述了一個由一所學校的所有學生填寫的表格,分爲四個部分,用於選舉校長。在這裡,我們使用驗證控制項來驗證用戶輸入。
這是「設計」視圖中的表單:
內容文件代碼如下:
<form id="form1" runat="server"> <table style="width: 66%;"> <tr> <td class="style1" colspan="3" align="center"> <asp:Label ID="lblmsg" Text="President Election Form : Choose your president" runat="server" /> </td> </tr> <tr> <td class="style3"> Candidate: </td> <td class="style2"> <asp:DropDownList ID="ddlcandidate" runat="server" style="width:239px"> <asp:ListItem>Please Choose a Candidate</asp:ListItem> <asp:ListItem>M H Kabir</asp:ListItem> <asp:ListItem>Steve Taylor</asp:ListItem> <asp:ListItem>John Abraham</asp:ListItem> <asp:ListItem>Venus Williams</asp:ListItem> </asp:DropDownList> </td> <td> <asp:RequiredFieldValidator ID="rfvcandidate" runat="server" ControlToValidate ="ddlcandidate" ErrorMessage="Please choose a candidate" InitialValue="Please choose a candidate"> </asp:RequiredFieldValidator> </td> </tr> <tr> <td class="style3"> House: </td> <td class="style2"> <asp:RadioButtonList ID="rblhouse" runat="server" RepeatLayout="Flow"> <asp:ListItem>Red</asp:ListItem> <asp:ListItem>Blue</asp:ListItem> <asp:ListItem>Yellow</asp:ListItem> <asp:ListItem>Green</asp:ListItem> </asp:RadioButtonList> </td> <td> <asp:RequiredFieldValidator ID="rfvhouse" runat="server" ControlToValidate="rblhouse" ErrorMessage="Enter your house name" > </asp:RequiredFieldValidator> <br /> </td> </tr> <tr> <td class="style3"> Class: </td> <td class="style2"> <asp:TextBox ID="txtclass" runat="server"></asp:TextBox> </td> <td> <asp:RangeValidator ID="rvclass" runat="server" ControlToValidate="txtclass" ErrorMessage="Enter your class (6 - 12)" MaximumValue="12" MinimumValue="6" Type="Integer"> </asp:RangeValidator> </td> </tr> <tr> <td class="style3"> Email: </td> <td class="style2"> <asp:TextBox ID="txtemail" runat="server" style="width:250px"> </asp:TextBox> </td> <td> <asp:RegularExpressionValidator ID="remail" runat="server" ControlToValidate="txtemail" ErrorMessage="Enter your email" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"> </asp:RegularExpressionValidator> </td> </tr> <tr> <td class="style3" align="center" colspan="3"> <asp:Button ID="btnsubmit" runat="server" onclick="btnsubmit_Click" style="text-align: center" Text="Submit" style="width:140px" /> </td> </tr> </table> <asp:ValidationSummary ID="ValidationSummary1" runat="server" DisplayMode ="BulletList" ShowSummary ="true" HeaderText="Errors:" /> </form>
提交按鈕後面的代碼:
protected void btnsubmit_Click(object sender, EventArgs e) { if (Page.IsValid) { lblmsg.Text = "Thank You"; } else { lblmsg.Text = "Fill up all the fields"; } }
ASP.NET - Database Access
ASP.NET允許訪問和使用以下數據源:
- Databases (e.g., Access, SQL 伺服器, Oracle, MySQL)
- XML documents
- Business Objects
- Flat files
NET隱藏了複雜的數據訪問過程,並提供了更高級別的類和對象,通過這些類和對象可以方便地訪問數據。這些類隱藏了連接、數據檢索、數據查詢和數據操作的所有複雜編碼。
ADO.NET是一種在各種ASP.NET控制項對象和後端數據源之間提供橋樑的技術。在本教程中,我們將簡要介紹數據訪問和數據處理。
Retrieve and display data
在ASP.NET中檢索和顯示數據需要兩種類型的數據控制項:
數據源控制項-它管理與數據的連接、數據的選擇以及其他作業,如數據的分頁和緩存等。
數據視圖控制項-它綁定並顯示數據並允許數據操作。
稍後我們將詳細討論數據綁定和數據源控制項。在本節中,我們將在本章中使用SqlDataSource控制項訪問數據,使用GridView控制項顯示和操作數據。
我們還將使用Access資料庫,其中包含有關市場上可用的.Net圖書的詳細信息。資料庫的名稱是ASPDotNetStepByStep.mdb,我們將使用數據表DotNetReferences。
該表包含以下列:ID、Title、AuthorFirstName、AuthorLastName、Topic和Publisher。
以下是數據表的快照:
讓我們直接採取行動,採取以下步驟:
(1) 創建網站並在web窗體上添加SqlDataSourceControl。
(2) 單擊「配置數據源」選項。
(3) 單擊「新建連接」按鈕以建立與資料庫的連接。
(4) 建立連接後,您可以將其保存以供進一步使用。在下一步中,將要求您配置select語句:
(5) 選擇列並單擊「下一步」完成這些步驟。注意WHERE、ORDER BY和Advanced按鈕。這些按鈕允許您提供where子句、order by子句,並分別指定SQL的insert、update和delete命令。這樣,您就可以操作數據。
(6) 在窗體上添加GridView控制項。選擇數據源並使用「自動套用格式」選項格式化控制項。
(7) 在此之後,格式化的GridView控制項將顯示列標題,並且應用程式已準備好執行。
(8) 最後執行應用程式。
內容文件代碼如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="dataaccess.aspx.cs" Inherits="datacaching.WebForm1" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Untitled Page </title> </head> <body> <form id="form1" runat="server"> <div> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString= "<%$ ConnectionStrings:ASPDotNetStepByStepConnectionString%>" ProviderName= "<%$ ConnectionStrings: ASPDotNetStepByStepConnectionString.ProviderName %>" SelectCommand="SELECT [Title], [AuthorLastName], [AuthorFirstName], [Topic] FROM [DotNetReferences]"> </asp:SqlDataSource> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="4" DataSourceID="SqlDataSource1" ForeColor="#333333" GridLines="無"> <RowStyle BackColor="#F7F6F3" ForeColor="#333333" /> <Columns> <asp:BoundField DataField="Title" HeaderText="Title" SortExpression="Title" /> <asp:BoundField DataField="AuthorLastName" HeaderText="AuthorLastName" SortExpression="AuthorLastName" /> <asp:BoundField DataField="AuthorFirstName" HeaderText="AuthorFirstName" SortExpression="AuthorFirstName" /> <asp:BoundField DataField="Topic" HeaderText="Topic" SortExpression="Topic" /> </Columns> <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" /> <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" /> <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> <EditRowStyle BackColor="#999999" /> <AlternatingRowStyle BackColor="White" ForeColor="#284775" /> </asp:GridView> </div> </form> </body> </html>
ADO.NET
ADO.NET提供了前端控制項和後端資料庫之間的橋樑。NET對象封裝了所有的數據訪問操作,控制項與這些對象交互以顯示數據,從而隱藏了數據移動的細節。
下圖顯示了ADO.NET對象:
The DataSet Class
數據集表示資料庫的一個子集。它沒有到資料庫的連續連接。要更新資料庫,需要重新連接。數據集包含數據表對象和數據關係對象。DataRelation對象表示兩個表之間的關係。
下表顯示了數據集類的一些重要屬性:
Properties | Description |
---|---|
CaseSensitive | Indicates whether string comparisons within the data tables are case-sensitive. |
Container | Gets the container for the component. |
DataSetName | Gets or sets the name of the current data set. |
DefaultViewManager | Returns a view of data in the data set. |
DesignMode | Indicates whether the component is currently in design mode. |
EnforceConstraints | Indicates whether constraint rules are followed when attempting any update operation. |
Events | Gets the list of event handlers that are attached to this component. |
ExtendedProperties | Gets the collection of customized user information associated with the DataSet. |
HasErrors | Indicates if there are any errors. |
IsInitialized | Indicates whether the DataSet is initialized. |
Locale | Gets or sets the locale information used to compare strings within the table. |
Namespace | Gets or sets the namespace of the DataSet. |
Prefix | Gets or sets an XML prefix that aliases the namespace of the DataSet. |
Relations | Returns the collection of DataRelation objects. |
Tables | Returns the collection of DataTable objects. |
下表顯示了數據集類的一些重要方法:
Methods | Description |
---|---|
AcceptChanges | Accepts all changes made since the DataSet was loaded or this method was called. |
BeginInit | Begins the initialization of the DataSet. The initialization occurs at run time. |
Clear | Clears data. |
Clone | Copies the structure of the DataSet, including all DataTable schemas, relations, and constraints. Does not copy any data. |
Copy | Copies both structure and data. |
CreateDataReader() | Returns a DataTableReader with one result set per DataTable, in the same sequence as the tables appear in the Tables collection. |
CreateDataReader(DataTable[]) | Returns a DataTableReader with one result set per DataTable. |
EndInit | Ends the initialization of the data set. |
Equals(Object) | Determines whether the specified Object is equal to the current Object. |
Finalize | Free resources and perform other cleanups. |
GetChanges | Returns a copy of the DataSet with all changes made since it was loaded or the AcceptChanges method was called. |
GetChanges(DataRowState) | Gets a copy of DataSet with all changes made since it was loaded or the AcceptChanges method was called, filtered by DataRowState. |
GetDataSetSchema | Gets a copy of XmlSchemaSet for the DataSet. |
GetObjectData | Populates a serialization information object with the data needed to serialize the DataSet. |
GetType | Gets the type of the current instance. |
GetXML | Returns the XML representation of the data. |
GetXMLSchema | Returns the XSD schema for the XML representation of the data. |
HasChanges() | Gets a value indicating whether the DataSet has changes, including new, deleted, or modified rows. |
HasChanges(DataRowState) | Gets a value indicating whether the DataSet has changes, including new, deleted, or modified rows, filtered by DataRowState. |
IsBinarySerialized | Inspects the format of the serialized representation of the DataSet. |
Load(IDataReader, LoadOption, DataTable[]) | Fills a DataSet with values from a data source using the supplied IDataReader, using an array of DataTable instances to supply the schema and namespace information. |
Load(IDataReader, LoadOption, String[]) | Fills a DataSet with values from a data source using the supplied IDataReader, using an array of strings to supply the names for the tables within the DataSet. |
Merge() | Merges the data with data from another DataSet. This method has different overloaded forms. |
ReadXML() | Reads an XML schema and data into the DataSet. This method has different overloaded forms. |
ReadXMLSchema(0) | Reads an XML schema into the DataSet. This method has different overloaded forms. |
RejectChanges | Rolls back all changes made since the last call to AcceptChanges. |
WriteXML() | Writes an XML schema and data from the DataSet. This method has different overloaded forms. |
WriteXMLSchema() | Writes the structure of the DataSet as an XML schema. This method has different overloaded forms. |
The DataTable Class
DataTable類表示資料庫中的表。它具有以下重要屬性;這些屬性中的大多數是只讀屬性,PrimaryKey屬性除外:
Properties | Description |
---|---|
ChildRelations | Returns the collection of child relationship. |
Columns | Returns the Columns collection. |
Constraints | Returns the Constraints collection. |
DataSet | Returns the parent DataSet. |
DefaultView | Returns a view of the table. |
ParentRelations | Returns the ParentRelations collection. |
PrimaryKey | Gets or sets an array of columns as the primary key for the table. |
Rows | Returns the Rows collection. |
下表顯示了DataTable類的一些重要方法:
Methods | Description |
---|---|
AcceptChanges | Commits all changes since the last AcceptChanges. |
Clear | Clears all data from the table. |
GetChanges | Returns a copy of the DataTable with all changes made since the AcceptChanges method was called. |
GetErrors | Returns an array of rows with errors. |
ImportRows | Copies a new row into the table. |
LoadDataRow | Finds and updates a specific row, or creates a new one, if not found any. |
Merge | Merges the table with another DataTable. |
NewRow | Creates a new DataRow. |
RejectChanges | Rolls back all changes made since the last call to AcceptChanges. |
Reset | Resets the table to its original state. |
Select | Returns an array of DataRow objects. |
The DataRow Class
The DataRow object represents a row in a table. 它具有以下重要特性:
Properties | Description |
---|---|
HasErrors | Indicates if there are any errors. |
Items | Gets or sets the data stored in a specific column. |
ItemArrays | Gets or sets all the values for the row. |
Table | Returns the parent table. |
下表顯示了DataRow類的一些重要方法:
Methods | Description |
---|---|
AcceptChanges | Accepts all changes made since this method was called. |
BeginEdit | Begins edit operation. |
CancelEdit | Cancels edit operation. |
Delete | Deletes the DataRow. |
EndEdit | Ends the edit operation. |
GetChildRows | Gets the child rows of this row. |
GetParentRow | Gets the parent row. |
GetParentRows | Gets parent rows of DataRow object. |
RejectChanges | Rolls back all changes made since the last call to AcceptChanges. |
The DataAdapter Object
DataAdapter對象充當數據集對象和資料庫之間的中介。這有助於數據集包含來自多個資料庫或其他數據源的數據。
The DataReader Object
DataReader對象是DataSet和DataAdapter組合的替代對象。此對象提供對資料庫中數據記錄的面向連接的訪問。這些對象適合只讀訪問,例如填充列表,然後斷開連接。
DbCommand and DbConnection Objects
DbConnection對象表示到數據源的連接。可以在不同的命令對象之間共享連接。
DbCommand對象表示從檢索或操作數據發送到資料庫的命令或存儲過程。
Example
到目前爲止,我們已經使用了計算機中已經存在的表和資料庫。在本例中,我們將創建一個表,向其中添加列、行和數據,並使用GridView對象顯示該表。
源文件代碼如下所示:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="createdatabase._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Untitled Page </title> </head> <body> <form id="form1" runat="server"> <div> <asp:GridView ID="GridView1" runat="server"> </asp:GridView> </div> </form> </body> </html>
代碼隱藏文件如下所示:
namespace createdatabase { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { DataSet ds = CreateDataSet(); GridView1.DataSource = ds.Tables["Student"]; GridView1.DataBind(); } } private DataSet CreateDataSet() { //creating a DataSet object for tables DataSet dataset = new DataSet(); // creating the student table DataTable Students = CreateStudentTable(); dataset.Tables.Add(Students); return dataset; } private DataTable CreateStudentTable() { DataTable Students = new DataTable("Student"); // adding columns AddNewColumn(Students, "System.Int32", "StudentID"); AddNewColumn(Students, "System.String", "StudentName"); AddNewColumn(Students, "System.String", "StudentCity"); // adding rows AddNewRow(Students, 1, "M H Kabir", "Kolkata"); AddNewRow(Students, 1, "Shreya Sharma", "Delhi"); AddNewRow(Students, 1, "Rini Mukherjee", "Hyderabad"); AddNewRow(Students, 1, "Sunil Dubey", "Bikaner"); AddNewRow(Students, 1, "Rajat Mishra", "Patna"); return Students; } private void AddNewColumn(DataTable table, string columnType, string columnName) { DataColumn column = table.Columns.Add(columnName, Type.GetType(columnType)); } //adding data into the table private void AddNewRow(DataTable table, int id, string name, string city) { DataRow newrow = table.NewRow(); newrow["StudentID"] = id; newrow["StudentName"] = name; newrow["StudentCity"] = city; table.Rows.Add(newrow); } } }
執行程序時,請注意以下事項:
應用程式首先創建一個數據集,並使用grid view控制項的DataBind()方法將其與GridView控制項綁定。
Createdataset()方法是一個用戶定義的函數,它創建一個新的數據集對象,然後調用另一個用戶定義的方法CreateStudentTable()來創建表並將其添加到數據集的表集合中。
CreateStudentTable()方法調用用戶定義的方法AddNewColumn()和AddNewRow()來創建表的列和行,並向行中添加數據。
執行頁面時,它返回表中的行,如下所示:
ASP.NET - File Uploading
ASP.NET有兩個控制項,允許用戶將文件上載到web伺服器。一旦伺服器接收到發布的文件數據,應用程式就可以保存、檢查或忽略它。以下控制項允許上載文件:
HtmlInputFile-一個HTML伺服器控制項
文件上載-和ASP.NET web控制項
兩個控制項都允許文件上載,但FileUpload控制項會自動設置表單的編碼,而HtmlInputFile則不會這樣做。
在本教程中,我們使用FileUpload控制項。FileUpload控制項允許用戶瀏覽並選擇要上載的文件,提供一個瀏覽按鈕和一個文本框來輸入文件名。
一旦用戶通過鍵入名稱或瀏覽在文本框中輸入了文件名,就可以調用FileUpload控制項的SaveAs方法將文件保存到磁碟。
FileUpload的基本語法是:
<asp:FileUpload ID= "Uploader" runat = "server" />
FileUpload類派生自WebControl類,並繼承其所有成員。除此之外,FileUpload類還具有以下只讀屬性:
Properties | Description |
---|---|
FileBytes | Returns an array of the bytes in a file to be uploaded. |
FileContent | Returns the stream object pointing to the file to be uploaded. |
FileName | Returns the name of the file to be uploaded. |
HasFile | Specifies whether the control has a file to upload. |
PostedFile | Returns a reference to the uploaded file. |
發布的文件封裝在HttpPostedFile類型的對象中,可以通過FileUpload類的posted file屬性訪問該對象。
HttpPostedFile類具有以下常用屬性:
Properties | Description |
---|---|
ContentLength | Returns the size of the uploaded file in bytes. |
ContentType | Returns the MIME type of the uploaded file. |
FileName | Returns the full filename. |
InputStream | Returns a stream object pointing to the uploaded file. |
Example
下面的示例演示FileUpload控制項及其屬性。表單有一個FileUpload控制項、一個save按鈕和一個label控制項,用於顯示文件名、文件類型和文件長度。
在「設計」視圖中,窗體如下所示:
內容文件代碼如下:
<body> <form id="form1" runat="server"> <div> <h3> File Upload:</h3> <br /> <asp:FileUpload ID="FileUpload1" runat="server" /> <br /><br /> <asp:Button ID="btnsave" runat="server" onclick="btnsave_Click" Text="Save" style="width:85px" /> <br /><br /> <asp:Label ID="lblmessage" runat="server" /> </div> </form> </body>
保存按鈕後面的代碼如下所示:
protected void btnsave_Click(object sender, EventArgs e) { StringBuilder sb = new StringBuilder(); if (FileUpload1.HasFile) { try { sb.AppendFormat(" Uploading file: {0}", FileUpload1.FileName); //saving the file FileUpload1.SaveAs("<c:\\SaveDirectory>" + FileUpload1.FileName); //Showing the file information sb.AppendFormat("<br/> Save As: {0}", FileUpload1.PostedFile.FileName); sb.AppendFormat("<br/> File type: {0}", FileUpload1.PostedFile.ContentType); sb.AppendFormat("<br/> File length: {0}", FileUpload1.PostedFile.ContentLength); sb.AppendFormat("<br/> File name: {0}", FileUpload1.PostedFile.FileName); } catch (Exception ex) { sb.Append("<br/> Error <br/>"); sb.AppendFormat("Unable to save file <br/> {0}", ex.Message); } } else { lblmessage.Text = sb.ToString(); } }
注意以下幾點:
StringBuilder類是從System.IO命名空間派生的,因此需要包含它。
try和catch塊用於捕獲錯誤,並顯示錯誤消息。
ASP.NET - Ad Rotator
AdRotator控制項從列表中隨機選擇橫幅圖形,該列表在外部XML計劃文件中指定。此外部XML計劃文件稱爲播發文件。
AdRotator控制項允許您分別在advisementfile和Target屬性中指定播發文件和連結應遵循的窗口類型。
添加AdRotator的基本語法如下:
<asp:AdRotator runat = "server" AdvertisementFile = "adfile.xml" Target = "_blank" />
在討論AdRotator控制項及其屬性的細節之前,讓我們先研究一下廣告文件的構造。
The Advertisement File
播發文件是一個XML文件,其中包含有關要顯示的播發的信息。
可擴展標記語言(XML)是用於文本文檔標記的W3C標準。它是一種基於文本的標記語言,允許您使用有意義的標記以結構化格式存儲數據。術語「可擴展」意味著您可以通過爲應用程式定義有意義的標記來擴展描述文檔的能力。
XML本身並不像HTML那樣是一種語言,而是一組用於創建新標記語言的規則。它是一種元標記語言。它允許開發人員爲特殊用途創建自定義標記集。它構造、存儲和傳輸信息。
以下是XML文件的示例:
<BOOK> <NAME> Learn XML </NAME> <AUTHOR> Samuel Peterson </AUTHOR> <PUBLISHER> NSS Publications </PUBLISHER> <PRICE> $30.00</PRICE> </BOOK>
與所有XML文件一樣,廣告文件需要是一個結構化文本文件,其中包含定義良好的標記來描述數據。廣告文件中通常使用以下標準XML元素:
Element | Description |
---|---|
Advertisements | Encloses the advertisement file. |
Ad | Delineates separate ad. |
ImageUrl | The path of image that will be displayed. |
NavigateUrl | The link that will be followed when the user clicks the ad. |
AlternateText | The text that will be displayed instead of the picture if it cannot be displayed. |
Keyword | Keyword identifying a group of advertisements. This is used for filtering. |
Impressions | The number indicating how often an advertisement will appear. |
Height | Height of the image to be displayed. |
Width | Width of the image to be displayed. |
除了這些標籤之外,還可以包括具有自定義屬性的自定義標籤。以下代碼演示了廣告文件ads.xml:
<Advertisements> <Ad> <ImageUrl>rose1.jpg</ImageUrl> <NavigateUrl>http://www.1800flowers.com</NavigateUrl> <AlternateText> Order flowers, roses, gifts and more </AlternateText> <Impressions>20</Impressions> <Keyword>flowers</Keyword> </Ad> <Ad> <ImageUrl>rose2.jpg</ImageUrl> <NavigateUrl>http://www.babybouquets.com.au</NavigateUrl> <AlternateText>Order roses and flowers</AlternateText> <Impressions>20</Impressions> <Keyword>gifts</Keyword> </Ad> <Ad> <ImageUrl>rose3.jpg</ImageUrl> <NavigateUrl>http://www.flowers2moscow.com</NavigateUrl> <AlternateText>Send flowers to Russia</AlternateText> <Impressions>20</Impressions> <Keyword>russia</Keyword> </Ad> <Ad> <ImageUrl>rose4.jpg</ImageUrl> <NavigateUrl>http://www.edibleblooms.com</NavigateUrl> <AlternateText>Edible Blooms</AlternateText> <Impressions>20</Impressions> <Keyword>gifts</Keyword> </Ad> </Advertisements>
Properties and Events of the AdRotator Class
AdRotator類派生自WebControl類並繼承其屬性。除此之外,AdRotator類還具有以下屬性:
Properties | Description |
---|---|
AdvertisementFile | The path to the advertisement file. |
AlternateTextFeild | The element name of the field where alternate text is provided. The default value is AlternateText. |
DataMember | The name of the specific list of data to be bound when advertisement file is not used. |
DataSource | Control from where it would retrieve data. |
DataSourceID | Id of the control from where it would retrieve data. |
Font | Specifies the font properties associated with the advertisement banner control. |
ImageUrlField | The element name of the field where the URL for the image is provided. The default value is ImageUrl. |
KeywordFilter | For displaying the keyword based ads only. |
NavigateUrlField | The element name of the field where the URL to navigate to is provided. The default value is NavigateUrl. |
Target | The browser window or frame that displays the content of the page linked. |
UniqueID | Obtains the unique, hierarchically qualified identifier for the AdRotator control. |
以下是AdRotator類的重要事件:
Events | Description |
---|---|
AdCreated | It is raised once per round trip to the server after creation of the control, but before the page is rendered |
DataBinding | Occurs when the server control binds to a data source. |
DataBound | Occurs after the server control binds to a data source. |
Disposed | Occurs when a server control is released from memory, which is the last stage of the server control lifecycle when an ASP.NET page is requested |
Init | Occurs when the server control is initialized, which is the first step in its lifecycle. |
Load | Occurs when the server control is loaded into the Page object. |
PreRender | Occurs after the Control object is loaded but prior to rendering. |
Unload | Occurs when the server control is unloaded from memory. |
Working with AdRotator Control
創建一個新網頁並在其上放置一個AdRotator控制項。
<form id="form1" runat="server"> <div> <asp:AdRotator ID="AdRotator1" runat="server" AdvertisementFile ="~/ads.xml" onadcreated="AdRotator1_AdCreated" /> </div> </form>
ads.xml文件和圖像文件應位於網站的根目錄中。
嘗試執行上面的應用程式,並注意每次重新加載頁面時,廣告都會更改。
ASP.NET - Calendars
日曆控制項是功能豐富的web控制項,它提供以下功能:
- Displaying one month at a time
- Selecting a day, a week or a month
- Selecting a range of days
- Moving from month to month
- Controlling the display of the days programmatically
日曆控制項的基本語法是:
<asp:Calender ID = "Calendar1" runat = "server"> </asp:Calender>
Properties and Events of the Calendar Control
日曆控制項有許多屬性和事件,使用這些屬性和事件可以自定義控制項的操作和顯示。下表提供了日曆控制項的一些重要屬性:
Properties | Description |
---|---|
Caption | Gets or sets the caption for the calendar control. |
CaptionAlign | Gets or sets the alignment for the caption. |
CellPadding | Gets or sets the number of spaces between the data and the cell border. |
CellSpacing | Gets or sets the space between cells. |
DayHeaderStyle | Gets the style properties for the section that displays the day of the week. |
DayNameFormat | Gets or sets format of days of the week. |
DayStyle | Gets the style properties for the days in the displayed month. |
FirstDayOfWeek | Gets or sets the day of week to display in the first column. |
NextMonthText | Gets or sets the text for next month navigation control. The default value is >. |
NextPrevFormat | Gets or sets the format of the next and previous month navigation control. |
OtherMonthDayStyle | Gets the style properties for the days on the Calendar control that are not in the displayed month. |
PrevMonthText | Gets or sets the text for previous month navigation control. The default value is <. |
SelectedDate | Gets or sets the selected date. |
SelectedDates | Gets a collection of DateTime objects representing the selected dates. |
SelectedDayStyle | Gets the style properties for the selected dates. |
SelectionMode | Gets or sets the selection mode that specifies whether the user can select a single day, a week or an entire month. |
SelectMonthText | Gets or sets the text for the month selection element in the selector column. |
SelectorStyle | Gets the style properties for the week and month selector column. |
SelectWeekText | Gets or sets the text displayed for the week selection element in the selector column. |
ShowDayHeader | Gets or sets the value indicating whether the heading for the days of the week is displayed. |
ShowGridLines | Gets or sets the value indicating whether the gridlines would be shown. |
ShowNextPrevMonth | Gets or sets a value indicating whether next and previous month navigation elements are shown in the title section. |
ShowTitle | Gets or sets a value indicating whether the title section is displayed. |
TitleFormat | Gets or sets the format for the title section. |
Titlestyle | Get the style properties of the title heading for the Calendar control. |
TodayDayStyle | Gets the style properties for today's date on the Calendar control. |
TodaysDate | Gets or sets the value for today's date. |
UseAccessibleHeader | Gets or sets a value that indicates whether to render the table header <th> HTML element for the day headers instead of the table data <td> HTML element. |
VisibleDate | Gets or sets the date that specifies the month to display. |
WeekendDayStyle | Gets the style properties for the weekend dates on the Calendar control. |
Calendar控制項有以下三個最重要的事件,允許開發人員對Calendar控制項進行編程。他們是:
Events | Description |
---|---|
SelectionChanged | It is raised when a day, a week or an entire month is selected. |
DayRender | It is raised when each data cell of the calendar control is rendered. |
VisibleMonthChanged | It is raised when user changes a month. |
Working with the Calendar Control
放置一個沒有任何代碼隱藏文件的裸體日曆控制項可以爲站點提供一個可用的日曆,顯示一年中的月份和日期。它還允許導航到下個月和上個月。
日曆控制項允許用戶選擇一天、一周或整個月。這是通過使用SelectionMode屬性完成的。此屬性具有以下值:
Properties | Description |
---|---|
Day | To select a single day. |
DayWeek | To select a single day or an entire week. |
DayWeekMonth | To select a single day, a week, or an entire month. |
無 | Nothing can be selected. |
選擇日期的語法:
<asp:Calender ID = "Calendar1" runat = "server" SelectionMode="DayWeekMonth"> </asp:Calender>
當選擇模式設置爲值DayWeekMonth時,將顯示一個帶有>符號的額外列,用於選擇周,並在天名稱的左側顯示一個>>符號,用於選擇月。
Example
以下示例演示如何選擇日期並在標籤中顯示日期:
內容文件代碼如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="calendardemo._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Untitled Page </title> </head> <body> <form id="form1" runat="server"> <div> <h3> Your Birthday:</h3> <asp:Calendar ID="Calendar1" runat="server SelectionMode="DayWeekMonth" onselectionchanged="Calendar1_SelectionChanged"> </asp:Calendar> </div> <p>Todays date is: <asp:Label ID="lblday" runat="server"></asp:Label> </p> <p>Your Birday is: <asp:Label ID="lblbday" runat="server"></asp:Label> </p> </form> </body> </html>
事件選擇的事件處理程序已更改:
protected void Calendar1_SelectionChanged(object sender, EventArgs e) { lblday.Text = Calendar1.TodaysDate.ToShortDateString(); lblbday.Text = Calendar1.SelectedDate.ToShortDateString(); }
運行文件時,應生成以下輸出:
ASP.NET - Multi Views
「多視圖」和「視圖」控制項允許您將頁面內容分成不同的組,一次只顯示一個組。每個視圖控制項管理一組內容,所有視圖控制項都在多視圖控制項中組合在一起。
多視圖控制項負責一次顯示一個視圖控制項。顯示的視圖稱爲活動視圖。
多視圖控制項的語法爲:
<asp:MultView ID= "MultiView1" runat= "server"> </asp:MultiView>
視圖控制項的語法爲:
<asp:View ID= "View1" runat= "server"> </asp:View>
但是,視圖控制項不能單獨存在。如果您嘗試單獨使用它,它將呈現錯誤。它始終與多視圖控制項一起使用,如下所示:
<asp:MultView ID= "MultiView1" runat= "server"> <asp:View ID= "View1" runat= "server"> </asp:View> </asp:MultiView>
Properties of View and MultiView Controls
視圖和多視圖控制項都派生自控制項類,並繼承其所有屬性、方法和事件。視圖控制項最重要的屬性是Boolean類型的Visible屬性,它設置視圖的可見性。
多視圖控制項具有以下重要屬性:
Properties | Description |
---|---|
Views | Collection of View controls within the MultiView. |
ActiveViewIndex | A zero based index that denotes the active view. If no view is active, then the index is -1. |
與多視圖控制項的導航關聯的按鈕控制項的CommandName屬性與多視圖控制項的某些相關欄位關聯。
例如,如果CommandName值爲next view的按鈕控制項與多視圖的導航關聯,則在單擊該按鈕時,它會自動導航到下一個視圖。
下表顯示了上述屬性的默認命令名:
Properties | Description |
---|---|
NextViewCommandName | NextView |
PreviousViewCommandName | PrevView |
SwitchViewByIDCommandName | SwitchViewByID |
SwitchViewByIndexCommandName | SwitchViewByIndex |
多視圖控制的重要方法是:
Methods | Description |
---|---|
SetActiveview | Sets the active view |
GetActiveview | Retrieves the active view |
每次更改視圖時,都會將頁面發回伺服器並引發許多事件。一些重要事件包括:
Events | Description |
---|---|
ActiveViewChanged | Raised when a view is changed |
Activate | Raised by the active view |
Deactivate | Raised by the inactive view |
除了上述屬性、方法和事件之外,多視圖控制項還繼承控制項和對象類的成員。
Example
示例頁面有三個視圖。每個視圖都有兩個用於瀏覽視圖的按鈕。
內容文件代碼如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="multiviewdemo._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Untitled Page </title> </head> <body> <form id="form1" runat="server"> <div> <h2>MultiView and View Controls</h2> <asp:DropDownList ID="DropDownList1" runat="server" onselectedindexchanged="DropDownList1_SelectedIndexChanged"> </asp:DropDownList> <hr /> <asp:MultiView ID="MultiView1" runat="server" ActiveViewIndex="2" onactiveviewchanged="MultiView1_ActiveViewChanged" > <asp:View ID="View1" runat="server"> <h3>This is view 1</h3> <br /> <asp:Button CommandName="NextView" ID="btnnext1" runat="server" Text = "Go To Next" /> <asp:Button CommandArgument="View3" CommandName="SwitchViewByID" ID="btnlast" runat="server" Text ="Go To Last" /> </asp:View> <asp:View ID="View2" runat="server"> <h3>This is view 2</h3> <asp:Button CommandName="NextView" ID="btnnext2" runat="server" Text = "Go To Next" /> <asp:Button CommandName="PrevView" ID="btnprevious2" runat="server" Text = "Go To Previous View" /> </asp:View> <asp:View ID="View3" runat="server"> <h3> This is view 3</h3> <br /> <asp:Calendar ID="Calender1" runat="server"></asp:Calendar> <br /> <asp:Button CommandArgument="0" CommandName="SwitchViewByIndex" ID="btnfirst" runat="server" Text = "Go To Next" /> <asp:Button CommandName="PrevView" ID="btnprevious" runat="server" Text = "Go To Previous View" /> </asp:View> </asp:MultiView> </div> </form> </body> </html>
注意以下事項:
MultiView.ActiveViewIndex決定將顯示哪個視圖。這是頁面上呈現的唯一視圖。當沒有顯示視圖時,ActiveViewIndex的默認值是-1。由於在示例中ActiveViewIndex被定義爲2,因此在執行時,它將顯示第三個視圖。
ASP.NET - Panel Controls
面板控制項用作頁面上其他控制項的容器。它控制包含的控制項的外觀和可見性。它還允許以編程方式生成控制項。
面板控制項的基本語法如下:
<asp:Panel ID= "Panel1" runat = "server"> </asp:Panel>
Panel控制項派生自WebControl類。因此它繼承了相同的所有屬性、方法和事件。它沒有自己的任何方法或事件。但是,它本身具有以下特性:
Properties | Description |
---|---|
BackImageUrl | URL of the background image of the panel. |
DefaultButton | Gets or sets the identifier for the default button that is contained in the Panel control. |
Direction | Text direction in the panel. |
GroupingText | Allows grouping of text as a field. |
HorizontalAlign | Horizontal alignment of the content in the panel. |
ScrollBars | Specifies visibility and location of scrollbars within the panel. |
Wrap | Allows text wrapping. |
Working with the Panel Control
讓我們從一個特定高度和寬度的簡單可滾動面板和邊框樣式開始。ScrollBars屬性設置爲兩個滾動條,因此兩個滾動條都被呈現。
源文件具有面板標記的以下代碼:
<asp:Panel ID="Panel1" runat="server" BorderColor="#990000" BorderStyle="Solid" Borderstyle="width:1px" Height="116px" ScrollBars="Both" style="width:278px"> This is a scrollable panel. <br /> <br /> <asp:Button ID="btnpanel" runat="server" Text="Button" style="width:82px" /> </asp:Panel>
面板呈現如下:
Example
下面的示例演示動態內容生成。用戶提供要在面板上生成的標籤控制項和文本框的數量。控制項是以編程方式生成的。
使用「屬性」窗口更改面板的屬性。在「設計」視圖上選擇控制項時,「屬性」窗口將顯示該特定控制項的屬性,並允許您在不鍵入內容的情況下進行更改。
示例的源文件如下所示:
<form id="form1" runat="server"> <div> <asp:Panel ID="pnldynamic" runat="server" BorderColor="#990000" BorderStyle="Solid" Borderstyle="width:1px" Height="150px" ScrollBars="Auto" style="width:60%" BackColor="#CCCCFF" Font-Names="Courier" HorizontalAlign="Center"> This panel shows dynamic control generation: <br /> <br /> </asp:Panel> </div> <table style="width: 51%;"> <tr> <td class="style2">No of Labels:</td> <td class="style1"> <asp:DropDownList ID="ddllabels" runat="server"> <asp:ListItem>0</asp:ListItem> <asp:ListItem>1</asp:ListItem> <asp:ListItem>2</asp:ListItem> <asp:ListItem>3</asp:ListItem> <asp:ListItem>4</asp:ListItem> </asp:DropDownList> </td> </tr> <tr> <td class="style2"> </td> <td class="style1"> </td> </tr> <tr> <td class="style2">No of Text Boxes :</td> <td class="style1"> <asp:DropDownList ID="ddltextbox" runat="server"> <asp:ListItem>0</asp:ListItem> <asp:ListItem Value="1"></asp:ListItem> <asp:ListItem>2</asp:ListItem> <asp:ListItem>3</asp:ListItem> <asp:ListItem Value="4"></asp:ListItem> </asp:DropDownList> </td> </tr> <tr> <td class="style2"> </td> <td class="style1"> </td> </tr> <tr> <td class="style2"> <asp:CheckBox ID="chkvisible" runat="server" Text="Make the Panel Visible" /> </td> <td class="style1"> <asp:Button ID="btnrefresh" runat="server" Text="Refresh Panel" style="width:129px" /> </td> </tr> </table> </form>
頁面加載事件後面的代碼負責動態生成控制項:
public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //make the panel visible pnldynamic.Visible = chkvisible.Checked; //generating the lable controls: int n = Int32.Parse(ddllabels.SelectedItem.Value); for (int i = 1; i <= n; i++) { Label lbl = new Label(); lbl.Text = "Label" + (i).ToString(); pnldynamic.Controls.Add(lbl); pnldynamic.Controls.Add(new LiteralControl("<br />")); } //generating the text box controls: int m = Int32.Parse(ddltextbox.SelectedItem.Value); for (int i = 1; i <= m; i++) { TextBox txt = new TextBox(); txt.Text = "Text Box" + (i).ToString(); pnldynamic.Controls.Add(txt); pnldynamic.Controls.Add(new LiteralControl("<br />")); } } }
執行時,面板呈現爲:
ASP.NET - Ajax Control
AJAX代表異步JavaScript和XML。這是一種跨平台技術,可加快響應時間。AJAX伺服器控制項將腳本添加到由瀏覽器執行和處理的頁面。
但是,與其他ASP.NET伺服器控制項一樣,這些AJAX伺服器控制項也可以具有與之關聯的方法和事件處理程序,這些方法和事件處理程序在伺服器端進行處理。
Visual Studio IDE中的控制項工具箱包含一組名爲「AJAX擴展」的控制項
The ScriptManager Control
ScriptManager控制項是最重要的控制項,必須出現在頁面上,其他控制項才能工作。
它有基本語法:
<asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager>
如果從「添加項」對話框創建「啓用Ajax的站點」或添加「Ajax Web表單」,則Web表單將自動包含腳本管理器控制項。ScriptManager控制項負責所有伺服器端控制項的客戶端腳本。
The UpdatePanel Control
UpdatePanel控制項是一個容器控制項,從控制項類派生。它充當內部子控制項的容器,並且沒有自己的接口。當其中的控制項觸發回發時,UpdatePanel會進行干預,以異步啓動回發並僅更新頁面的那一部分。
例如,如果按鈕控制項位於「更新」面板中並單擊它,則只有「更新」面板中的控制項會受到影響,頁面其他部分上的控制項不會受到影響。這稱爲部分回發或異步回發。
Example
在應用程式中添加AJAX web表單。默認情況下,它包含腳本管理器控制項。插入更新面板。在「更新面板」控制項中放置按鈕控制項和標籤控制項。在面板外部放置另一組按鈕和標籤。
設計視圖如下所示:
源文件如下:
<form id="form1" runat="server"> <div> <asp:ScriptManager ID="ScriptManager1" runat="server" /> </div> <asp:UpdatePanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <asp:Button ID="btnpartial" runat="server" onclick="btnpartial_Click" Text="Partial PostBack"/> <br /> <br /> <asp:Label ID="lblpartial" runat="server"></asp:Label> </ContentTemplate> </asp:UpdatePanel> <p> </p> <p>Outside the Update Panel</p> <p> <asp:Button ID="btntotal" runat="server" onclick="btntotal_Click" Text="Total PostBack" /> </p> <asp:Label ID="lbltotal" runat="server"></asp:Label> </form>
兩個按鈕控制項對於事件處理程序具有相同的代碼:
string time = DateTime.Now.ToLongTimeString(); lblpartial.Text = "Showing time from panel" + time; lbltotal.Text = "Showing time from outside" + time;
請注意,在執行頁面時,如果單擊「總回發」按鈕,則它會更新兩個標籤中的時間,但如果單擊「部分回發」按鈕,則它只更新「更新」面板中的標籤。
一個頁面可以包含多個更新面板,每個面板包含其他控制項(如網格)並顯示數據的不同部分。
當發生總回發時,默認情況下更新面板內容。可以通過更改控制項的UpdateMode屬性來更改此默認模式。讓我們看看更新面板的其他屬性。
Properties of the UpdatePanel Control
下表顯示更新面板控制項的屬性:
Properties | Description |
---|---|
ChildrenAsTriggers | This property indicates whether the post backs are coming from the child controls, which cause the update panel to refresh. |
ContentTemplate | It is the content template and defines what appears in the update panel when it is rendered. |
ContentTemplateContainer | Retrieves the dynamically created template container object and used for adding child controls programmatically. |
IsInPartialRendering | Indicates whether the panel is being updated as part of the partial post back. |
RenderMode | Shows the render modes. The available modes are Block and Inline. |
UpdateMode | Gets or sets the rendering mode by determining some conditions. |
Triggers | Defines the collection trigger objects each corresponding to an event causing the panel to refresh automatically. |
Methods of the UpdatePanel Control
下表顯示了更新面板控制項的方法:
Methods | Description |
---|---|
CreateContentTemplateContainer | Creates a Control object that acts as a container for child controls that define the UpdatePanel control's content. |
CreateControlCollection | Returns the collection of all controls that are contained in the UpdatePanel control. |
Initialize | Initializes the UpdatePanel control trigger collection if partial-page rendering is enabled. |
Update | Causes an update of the content of an UpdatePanel control. |
更新面板的行爲取決於UpdateMode屬性和ChildrenAsTriggers屬性的值。
UpdateMode | ChildrenAsTriggers | Effect |
---|---|---|
Always | False | Illegal parameters. |
Always | True | UpdatePanel refreshes if whole page refreshes or a child control on it posts back. |
Conditional | False | UpdatePanel refreshes if whole page refreshes or a triggering control outside it initiates a refresh. |
Conditional | True | UpdatePanel refreshes if whole page refreshes or a child control on it posts back or a triggering control outside it initiates a refresh. |
The UpdateProgress Control
當更新一個或多個更新面板控制項時,UpdateProgress控制項在瀏覽器上提供一種反饋。例如,當用戶在執行某些面向資料庫的作業時登錄或等待伺服器響應。
它提供了一個類似「正在加載頁面…」的視覺確認,指示工作正在進行。
UpdateProgress控制項的語法爲:
<asp:UpdateProgress ID="UpdateProgress1" runat="server" DynamicLayout="true" AssociatedUpdatePanelID="UpdatePanel1" > <ProgressTemplate> Loading... </ProgressTemplate> </asp:UpdateProgress>
上面的代碼片段顯示了ProgressTemplate標記中的一條簡單消息。但是,它可以是一個圖像或其他相關控制項。UpdateProgress控制項將爲每個異步回發顯示,除非使用AssociatedUpdatePanelID屬性將其分配給單個更新面板。
Properties of the UpdateProgress Control
下表顯示更新進度控制項的屬性:
Properties | Description |
---|---|
AssociatedUpdatePanelID | Gets and sets the ID of the update panel with which this control is associated. |
Attributes | Gets or sets the cascading style sheet (CSS) attributes of the UpdateProgress control. |
DisplayAfter | Gets and sets the time in milliseconds after which the progress template is displayed. The default is 500. |
DynamicLayout | Indicates whether the progress template is dynamically rendered. |
ProgressTemplate | Indicates the template displayed during an asynchronous post back which takes more time than the DisplayAfter time. |
Methods of the UpdateProgress Control
下表顯示了更新進度控制項的方法:
Methods | Description |
---|---|
GetScriptDescriptors | Returns a list of components, behaviors, and client controls that are required for the UpdateProgress control's client functionality. |
GetScriptReferences | Returns a list of client script library dependencies for the UpdateProgress control. |
The Timer Control
定時器控制用於自動啓動回發。這可以通過兩種方式實現:
(1) 設置UpdatePanel控制項的Triggers屬性:
<Triggers> <asp:AsyncPostBackTrigger ControlID="btnpanel2" EventName="Click" /> </Triggers>
(2) 將計時器控制項直接放在UpdatePanel中作爲子控制項觸發器。單個計時器可以是多個UpdatePanel的觸發器。
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Always"> <ContentTemplate> <asp:Timer ID="Timer1" runat="server" Interval="1000"> </asp:Timer> <asp:Label ID="Label1" runat="server" Height="101px" style="width:304px" > </asp:Label> </ContentTemplate> </asp:UpdatePanel>
ASP.NET - Data Sources
數據源控制項與數據綁定控制項交互並隱藏複雜的數據綁定過程。這些工具向數據綁定控制項提供數據,並支持執行插入、刪除、排序和更新等操作。
每個數據源控制項包裝特定的數據提供程序關係資料庫、XML文檔或自定義類,並有助於:
- Managing connection
- Selecting data
- Managing presentation aspects like paging, caching, etc.
- Manipulating data
在ASP.NET中有許多數據源控制項可用於從SQL 伺服器、ODBC或OLE DB伺服器、XML文件和業務對象訪問數據。
根據數據類型,這些控制項可以分爲兩類:
- Hierarchical data source controls
- Table-based data source controls
用於分層數據的數據源控制項包括:
XMLDataSource-它允許綁定到包含或不包含架構信息的XML文件和字符串。
SiteMapDataSource-它允許綁定到提供站點地圖信息的提供程序。
用於表格數據的數據源控制項包括:
Data source controls | Description |
---|---|
SqlDataSource | It represents a connection to an ADO.NET data provider that returns SQL data, including data sources accessible via OLEDB and ODBC. |
ObjectDataSource | It allows binding to a custom .Net business object that returns data. |
LinqdataSource | It allows binding to the results of a Linq-to-SQL query (supported by ASP.NET 3.5 only). |
AccessDataSource | It represents connection to a Microsoft Access database. |
Data Source Views
數據源視圖是DataSourceView類的對象。表示不同數據操作(如排序、篩選等)的自定義數據視圖。
data source view類充當所有數據源視圖類的基類,這些類定義了數據源控制項的功能。
下表提供了DataSourceView類的屬性:
Properties | Description |
---|---|
CanDelete | Indicates whether deletion is allowed on the underlying data source. |
CanInsert | Indicates whether insertion is allowed on the underlying data source. |
CanPage | Indicates whether paging is allowed on the underlying data source. |
CanRetrieveTotalRowCount | Indicates whether total row count information is available. |
CanSort | Indicates whether the data could be sorted. |
CanUpdate | Indicates whether updates are allowed on the underlying data source. |
Events | Gets a list of event-handler delegates for the data source view. |
Name | Name of the view. |
下表提供了DataSourceView類的方法:
Methods | Description |
---|---|
CanExecute | Determines whether the specified command can be executed. |
ExecuteCommand | Executes the specific command. |
ExecuteDelete | Performs a delete operation on the list of data that the DataSourceView object represents. |
ExecuteInsert | Performs an insert operation on the list of data that the DataSourceView object represents. |
ExecuteSelect | Gets a list of data from the underlying data storage. |
ExecuteUpdate | Performs an update operation on the list of data that the DataSourceView object represents. |
Delete | Performs a delete operation on the data associated with the view. |
Insert | Performs an insert operation on the data associated with the view. |
Select | Returns the queried data. |
Update | Performs an update operation on the data associated with the view. |
OnDataSourceViewChanged | Raises the DataSourceViewChanged event. |
RaiseUnsupportedCapabilitiesError | Called by the RaiseUnsupportedCapabilitiesError method to compare the capabilities requested for an ExecuteSelect operation against those that the view supports. |
The SqlDataSource Control
SqlDataSource控制項表示到關係資料庫(如SQL 伺服器或Oracle資料庫)的連接,或通過OLEDB或開放式資料庫連接(ODBC)訪問的數據。通過兩個重要屬性ConnectionString和ProviderName與數據建立連接。
以下代碼段提供控制項的基本語法:
<asp:SqlDataSource runat="server" ID="MySqlSource" ProviderName='<%$ ConnectionStrings:LocalNWind.ProviderName %>' ConnectionString='<%$ ConnectionStrings:LocalNWind %>' SelectionCommand= "SELECT * FROM EMPLOYEES" /> <asp:GridView ID="GridView1" runat="server" DataSourceID="MySqlSource" />
在基礎數據上配置各種數據操作取決於數據源控制項的各種屬性(屬性組)。
下表提供了SqlDataSource控制項的相關屬性集,該控制項提供了該控制項的編程接口:
Property Group | Description |
---|---|
刪除命令, 刪除參數, 刪除命令類型 |
Gets or sets the SQL statement, parameters, and type for deleting rows in the underlying data. |
過濾表達式, 過濾器 |
Gets or sets the data filtering string and parameters. |
插入 插入 插入式 |
Gets or sets the SQL statement, parameters, and type for inserting rows in the underlying database. |
選擇命令, 選擇參數, SelectCommandType |
Gets or sets the SQL statement, parameters, and type for retrieving rows from the underlying database. |
SortParameterName | Gets or sets the name of an input parameter that the command's stored procedure will use to sort data. |
最新點評 更新參數, 更新命令類型 |
Gets or sets the SQL statement, parameters, and type for updating rows in the underlying data store. |
以下代碼段顯示了爲數據操作啓用的數據源控制項:
<asp:SqlDataSource runat="server" ID= "MySqlSource" ProviderName='<%$ ConnectionStrings:LocalNWind.ProviderName %>' ConnectionString=' <%$ ConnectionStrings:LocalNWind %>' SelectCommand= "SELECT * FROM EMPLOYEES" UpdateCommand= "UPDATE EMPLOYEES SET LASTNAME=@lame" DeleteCommand= "DELETE FROM EMPLOYEES WHERE EMPLOYEEID=@eid" FilterExpression= "EMPLOYEEID > 10"> ..... ..... </asp:SqlDataSource>
The ObjectDataSource Control
ObjectDataSource控制項允許用戶定義的類將其方法的輸出與數據綁定控制項相關聯。這個類的編程接口幾乎與SqlDataSource控制項相同。
以下是綁定業務對象的兩個重要方面:
可綁定類應該有一個默認的構造函數,它應該是無狀態的,並且具有可以映射到選擇、更新、插入和刪除語義的方法。
對象必須一次更新一個項,不支持批處理操作。
讓我們直接到一個例子來使用這個控制項。student類是要與對象數據源一起使用的類。這個類有三個屬性:學生id、姓名和城市。它有一個默認的構造函數和一個用於檢索數據的GetStudents方法。
學生班:
public class Student { public int StudentID { get; set; } public string Name { get; set; } public string City { get; set; } public Student() { } public DataSet GetStudents() { DataSet ds = new DataSet(); DataTable dt = new DataTable("Students"); dt.Columns.Add("StudentID", typeof(System.Int32)); dt.Columns.Add("StudentName", typeof(System.String)); dt.Columns.Add("StudentCity", typeof(System.String)); dt.Rows.Add(new object[] { 1, "M. H. Kabir", "Calcutta" }); dt.Rows.Add(new object[] { 2, "Ayan J. Sarkar", "Calcutta" }); ds.Tables.Add(dt); return ds; } }
執行以下步驟將對象與對象數據源綁定並檢索數據:
創建新網站。
通過右鍵單擊解決方案資源管理器中的項目,添加類模板,並在其中放置上述代碼,將類(Students.cs)添加到其中。
構建解決方案,以便應用程式可以使用對類的引用。
在web窗體中放置對象數據源控制項。
通過選擇對象來配置數據源。
爲數據上的不同操作選擇數據方法。在這個例子中,只有一個方法。
將數據綁定控制項(如網格視圖)放置在頁面上,並選擇對象數據源作爲其基礎數據源。
在此階段,設計視圖應如下所示:
運行這個項目,它從students類中檢索硬編碼的元組。
The AccessDataSource Control
AccessDataSource控制項表示到Access資料庫的連接。它基於SqlDataSource控制項並提供更簡單的編程接口。以下代碼段提供了數據源的基本語法:
<asp:AccessDataSource ID="AccessDataSource1 runat="server" DataFile="~/App_Data/ASPDotNetStepByStep.mdb" SelectCommand="SELECT * FROM [DotNetReferences]"> </asp:AccessDataSource>
AccessDataSource控制項以只讀模式打開資料庫。但是,它也可以用於執行插入、更新或刪除操作。這是使用ADO.NET命令和參數集合完成的。
對於來自ASP.NET應用程式內的Access資料庫,更新是有問題的,因爲Access資料庫是一個普通文件,並且ASP.NET應用程式的默認帳戶可能沒有寫入資料庫文件的權限。
ASP.NET - Data Binding
每個ASP.NET web窗體控制項都從其父控制項類繼承data bind方法,這使其具有將數據綁定到其至少一個屬性的固有功能。這稱爲簡單數據綁定或內聯數據綁定。
簡單的數據綁定涉及將實現IEnumerable接口的任何集合(項集合)或數據集和數據表類附加到控制項的DataSource屬性。
另一方面,一些控制項可以通過數據源控制項將記錄、列表或數據列綁定到其結構中。這些控制項派生自BaseDataBoundControl類。這稱爲聲明性數據綁定。
數據源控制項幫助數據綁定控制項實現排序、分頁和編輯數據集合等功能。
BaseDataBoundControl是一個抽象類,由另外兩個抽象類繼承:
- DataBoundControl
- HierarchicalDataBoundControl
抽象類DataBoundControl再次被另外兩個抽象類繼承:
- ListControl
- CompositeDataBoundControl
能夠簡單數據綁定的控制項是從ListControl抽象類派生的,這些控制項是:
- BulletedList
- CheckBoxList
- DropDownList
- ListBox
- RadioButtonList
能夠聲明性數據綁定(更複雜的數據綁定)的控制項是從抽象類CompositeDataBoundControl派生的。這些控制項包括:
- DetailsView
- FormView
- GridView
- RecordList
Simple Data Binding
簡單的數據綁定涉及只讀選擇列表。這些控制項可以綁定到數組列表或資料庫中的欄位。選擇列表從資料庫或數據源獲取兩個值;一個值由列表顯示,另一個被視爲與顯示相對應的值。
讓我們舉一個小例子來理解這個概念。創建一個帶有項目符號列表和SqlDataSource控制項的網站。將數據源控制項配置爲從資料庫檢索兩個值(我們使用與上一章中相同的DotNetReferences表)。
爲項目符號列表控制項選擇數據源包括:
- Selecting the data source control
- Selecting a field to display, which is called the data field
- Selecting a field for the value
執行應用程式時,請檢查整個標題列是否綁定到項目符號列表並顯示出來。
Declarative Data Binding
在上一個使用GridView控制項的教程中,我們已經使用了聲明性數據綁定。其他能夠以表格方式顯示和操作數據的複合數據綁定控制項是DetailsView、FormView和RecordList控制項。
在下一個教程中,我們將研究處理資料庫的技術,即ADO.NET。
但是,數據綁定涉及以下對象:
存儲從資料庫檢索到的數據的數據集。
數據提供程序,通過在連接上使用命令從資料庫檢索數據。
發出存儲在命令對象中的select語句的數據適配器;它還可以通過發出Insert、Delete和update語句來更新資料庫中的數據。
數據綁定對象之間的關係:
Example
讓我們採取以下步驟:
步驟(1):創建新網站。通過在解決方案資源管理器中右鍵單擊解決方案名稱並從「添加項目」對話框中選擇項目「類」,添加名爲booklist的類。把它命名爲booklist.cs。
using System; using System.Data; using System.Configuration; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; namespace databinding { public class booklist { protected String bookname; protected String authorname; public booklist(String bname, String aname) { this.bookname = bname; this.authorname = aname; } public String Book { get { return this.bookname; } set { this.bookname = value; } } public String Author { get { return this.authorname; } set { this.authorname = value; } } } }
步驟(2):在頁面上添加四個列表控制項列表框控制項、單選按鈕列表、複選框列表、下拉列表和四個標籤以及這些列表控制項。在「設計」視圖中,頁面應如下所示:
源文件應如下所示:
<form id="form1" runat="server"> <div> <table style="width: 559px"> <tr> <td style="width: 228px; height: 157px;"> <asp:ListBox ID="ListBox1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="ListBox1_SelectedIndexChanged"> </asp:ListBox> </td> <td style="height: 157px"> <asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged"> </asp:DropDownList> </td> </tr> <tr> <td style="width: 228px; height: 40px;"> <asp:Label ID="lbllistbox" runat="server"></asp:Label> </td> <td style="height: 40px"> <asp:Label ID="lbldrpdown" runat="server"> </asp:Label> </td> </tr> <tr> <td style="width: 228px; height: 21px"> </td> <td style="height: 21px"> </td> </tr> <tr> <td style="width: 228px; height: 21px"> <asp:RadioButtonList ID="RadioButtonList1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="RadioButtonList1_SelectedIndexChanged"> </asp:RadioButtonList> </td> <td style="height: 21px"> <asp:CheckBoxList ID="CheckBoxList1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="CheckBoxList1_SelectedIndexChanged"> </asp:CheckBoxList> </td> </tr> <tr> <td style="width: 228px; height: 21px"> <asp:Label ID="lblrdlist" runat="server"> </asp:Label> </td> <td style="height: 21px"> <asp:Label ID="lblchklist" runat="server"> </asp:Label> </td> </tr> </table> </div> </form>
步驟(3):最後,編寫應用程式的以下代碼隱藏例程:
public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { IList bklist = createbooklist(); if (!this.IsPostBack) { this.ListBox1.DataSource = bklist; this.ListBox1.DataTextField = "Book"; this.ListBox1.DataValueField = "Author"; this.DropDownList1.DataSource = bklist; this.DropDownList1.DataTextField = "Book"; this.DropDownList1.DataValueField = "Author"; this.RadioButtonList1.DataSource = bklist; this.RadioButtonList1.DataTextField = "Book"; this.RadioButtonList1.DataValueField = "Author"; this.CheckBoxList1.DataSource = bklist; this.CheckBoxList1.DataTextField = "Book"; this.CheckBoxList1.DataValueField = "Author"; this.DataBind(); } } protected IList createbooklist() { ArrayList allbooks = new ArrayList(); booklist bl; bl = new booklist("UNIX CONCEPTS", "SUMITABHA DAS"); allbooks.Add(bl); bl = new booklist("PROGRAMMING IN C", "RICHI KERNIGHAN"); allbooks.Add(bl); bl = new booklist("DATA STRUCTURE", "TANENBAUM"); allbooks.Add(bl); bl = new booklist("NETWORKING CONCEPTS", "FOROUZAN"); allbooks.Add(bl); bl = new booklist("PROGRAMMING IN C++", "B. STROUSTROUP"); allbooks.Add(bl); bl = new booklist("ADVANCED JAVA", "SUMITABHA DAS"); allbooks.Add(bl); return allbooks; } protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e) { this.lbllistbox.Text = this.ListBox1.SelectedValue; } protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) { this.lbldrpdown.Text = this.DropDownList1.SelectedValue; } protected void RadioButtonList1_SelectedIndexChanged(object sender, EventArgs e) { this.lblrdlist.Text = this.RadioButtonList1.SelectedValue; } protected void CheckBoxList1_SelectedIndexChanged(object sender, EventArgs e) { this.lblchklist.Text = this.CheckBoxList1.SelectedValue; } }
注意以下事項:
booklist類有兩個屬性:bookname和authorname。
createbooklist方法是一個用戶定義的方法,它創建一個名爲allbooks的booklist對象數組。
頁面加載事件處理程序可確保創建書籍列表。列表是IList類型,它實現IEnumerable接口,並能夠綁定到列表控制項。頁面加載事件處理程序將IList對象「bklist」與列表控制項綁定。將顯示bookname屬性,並將authorname屬性視爲值。
當頁面運行時,如果用戶選擇一本書,則其名稱由列表控制項選擇並顯示,而相應的標籤則顯示作者名稱,這是列表控制項所選索引的相應值。
ASP.NET - Custom Controls
User Controls
用戶控制項的行爲類似於微型ASP.NET頁面或web窗體,可供許多其他頁面使用。這些是從System.Web.UI.UserControl類派生的。這些控制項具有以下特徵:
- They have an .ascx extension.
- They may not contain any <html>, <body>, or <form> tags.
- They have a Control directive instead of a Page directive.
爲了理解這個概念,讓我們創建一個簡單的用戶控制項,它將作爲網頁的頁腳。要創建和使用用戶控制項,請執行以下步驟:
- Create a new web application.
- Right click on the project folder on the Solution Explorer and choose Add New Item.
從「添加新項」對話框中選擇「Web用戶控制項」,並將其命名爲footer.ascx。最初,footer.ascx只包含一個控制指令。
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="footer.ascx.cs" Inherits="customcontroldemo.footer" %>
向文件中添加以下代碼:
<table> <tr> <td align="center"> Copyright ©2010 TutorialPoints Ltd.</td> </tr> <tr> <td align="center"> Location: Hyderabad, A.P </td> </tr> </table>
若要將用戶控制項添加到網頁,必須將Register指令和用戶控制項的實例添加到網頁。以下代碼顯示內容文件:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="customcontroldemo._Default" %> <%@ Register Src="~/footer.ascx" TagName="footer" TagPrefix="Tfooter" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Untitled Page </title> </head> <body> <form id="form1" runat="server"> <div> <asp:Label ID="Label1" runat="server" Text="Welcome to ASP.Net Tutorials "></asp:Label> <br /> <br /> <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Copyright Info" /> </div> <Tfooter:footer ID="footer1" runat="server" /> </form> </body> </html>
執行時,頁面顯示頁腳,此控制項可用於網站的所有頁面。
注意以下事項:
(1) Register指令指定控制項的標記名和標記前綴。
<%@ Register Src="~/footer.ascx" TagName="footer" TagPrefix="Tfooter" %>
(2) 在頁面上添加用戶控制項時,應使用以下標記名和前綴:
<Tfooter:footer ID="footer1" runat="server" />
Custom Controls
自定義控制項部署爲單個程序集。它們被編譯成動態連結庫(DLL)並用作任何其他ASP.NET伺服器控制項。它們可以通過以下任一方式創建:
- By deriving a custom control from an existing control
- By composing a new custom control combing two or more existing controls.
- By deriving from the base control class.
爲了理解這個概念,讓我們創建一個自定義控制項,它只需在瀏覽器上呈現一條文本消息。要創建此控制項,請執行以下步驟:
創建一個新網站。右鍵單擊解決方案資源管理器中樹頂部的解決方案(而不是項目)。
在「新建項目」對話框中,從項目模板中選擇「ASP.NET伺服器控制項」。
上面的步驟將添加一個新項目,並爲解決方案創建一個完整的自定義控制項,稱爲伺服器Control1。在本例中,我們將項目命名爲CustomControls。若要使用此控制項,必須將其添加爲對網站的引用,然後才能將其註冊到網頁上。若要添加對現有項目的引用,請在項目(而不是解決方案)上單擊滑鼠右鍵,然後單擊「添加引用」。
從「添加引用」對話框的「項目」選項卡中選擇「自定義控制項」項目。解決方案資源管理器應顯示引用。
要在頁上使用控制項,請在@page指令下面添加Register指令:
<%@ Register Assembly="CustomControls" Namespace="CustomControls" TagPrefix="ccs" %>
此外,您可以使用控制項,類似於任何其他控制項。
<form id="form1" runat="server"> <div> <ccs:伺服器Control1 runat="server" Text = "I am a Custom 伺服器 Control" /> </div> </form>
執行時,控制項的文本屬性將在瀏覽器上呈現,如下所示:
Working with Custom Controls
在上一個示例中,設置了自定義控制項的文本屬性的值。默認情況下,在創建控制項時,ASP.NET添加了此屬性。下面的控制項代碼隱藏文件揭示了這一點。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace CustomControls { [DefaultProperty("Text")] [ToolboxData("<{0}:伺服器Control1 runat=server></{0}:伺服器Control1 >")] public class 伺服器Control1 : WebControl { [Bindable(true)] [Category("Appearance")] [DefaultValue("")] [Localizable(true)] public string Text { get { String s = (String)ViewState["Text"]; return ((s == null) ? "[" + this.ID + "]" : s); } set { ViewState["Text"] = value; } } protected override void RenderContents(HtmlTextWriter output) { output.Write(Text); } } }
以上代碼是爲自定義控制項自動生成的。事件和方法可以添加到自定義控制項類中。
Example
讓我們展開前面名爲SeverControl1的自定義控制項。讓我們給它一個名爲checkpalindrome的方法,它有權檢查回文。
回文是在反轉時拼寫相同的單詞/文字。例如,馬拉雅拉姆、夫人、薩拉等。
擴展自定義控制項的代碼,該代碼應如下所示:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace CustomControls { [DefaultProperty("Text")] [ToolboxData("<{0}:伺服器Control1 runat=server></{0}:伺服器Control1 >")] public class 伺服器Control1 : WebControl { [Bindable(true)] [Category("Appearance")] [DefaultValue("")] [Localizable(true)] public string Text { get { String s = (String)ViewState["Text"]; return ((s == null) ? "[" + this.ID + "]" : s); } set { ViewState["Text"] = value; } } protected override void RenderContents(HtmlTextWriter output) { if (this.checkpanlindrome()) { output.Write("This is a palindrome: <br />"); output.Write("<FONT size=5 color=Blue>"); output.Write("<B>"); output.Write(Text); output.Write("</B>"); output.Write("</FONT>"); } else { output.Write("This is not a palindrome: <br />"); output.Write("<FONT size=5 color=red>"); output.Write("<B>"); output.Write(Text); output.Write("</B>"); output.Write("</FONT>"); } } protected bool checkpanlindrome() { if (this.Text != null) { String str = this.Text; String strtoupper = Text.ToUpper(); char[] rev = strtoupper.ToCharArray(); Array.Reverse(rev); String strrev = new String(rev); if (strtoupper == strrev) { return true; } else { return false; } } else { return false; } } } }
更改控制項的代碼時,必須通過單擊「生成」->「生成解決方案」來生成解決方案,以便將更改反映在項目中。在頁面中添加文本框和按鈕控制項,以便用戶可以提供文本,當單擊按鈕時,將檢查是否有回文。
<form id="form1" runat="server"> <div> Enter a word: <br /> <asp:TextBox ID="TextBox1" runat="server" style="width:198px"> </asp:TextBox> <br /> <br /> <asp:Button ID="Button1" runat="server onclick="Button1_Click" Text="Check Palindrome" style="width:132px" /> <br /> <br /> <ccs:伺服器Control1 ID="伺服器Control11" runat="server" Text = "" /> </div> </form>
按鈕的單擊事件處理程序只是將文本從文本框複製到自定義控制項的文本屬性。
protected void Button1_Click(object sender, EventArgs e) { this.伺服器Control11.Text = this.TextBox1.Text; }
執行時,控制項將成功檢查回文。
注意以下事項:
(1) 向自定義控制項添加引用時,它將被添加到工具箱中,您可以直接從工具箱中使用它,與任何其他控制項類似。
(2) 自定義控制項類的RenderContents方法在此處被重寫,因爲您可以添加自己的方法和事件。
(3) RenderContents方法接受HtmlTextWriter類型的參數,該參數負責在瀏覽器上進行呈現。
ASP.NET - Personalization
網站是爲用戶的重複訪問而設計的。個性化允許站點記住用戶身份和其他信息細節,並爲每個用戶呈現個性化的環境。
NET提供個性化網站的服務,以滿足特定客戶的口味和偏好。
Understanding Profiles
ASP.NET個性化服務基於用戶配置文件。用戶配置文件定義站點所需的用戶信息類型。例如,姓名、年齡、地址、出生日期和電話號碼。
此信息在應用程式的web.config文件中定義,ASP.NET運行時將讀取並使用它。此工作由個性化設置提供程序完成。
從用戶數據獲得的用戶配置文件存儲在由ASP.NET創建的默認資料庫中。您可以創建自己的資料庫來存儲配置文件。配置文件數據定義存儲在配置文件web.config中。
Example
讓我們創建一個示例站點,讓應用程式記住用戶名、地址、出生日期等用戶詳細信息。將配置文件詳細信息添加到web.config文件的<system.web>元素中。
<configuration> <system.web> <profile> <properties> <add name="Name" type ="String"/> <add name="Birthday" type ="System.DateTime"/> <group name="Address"> <add name="Street"/> <add name="City"/> <add name="State"/> <add name="Zipcode"/> </group> </properties> </profile> </system.web> </configuration>
當在web.config文件中定義配置文件時,可以通過在當前HttpContext中找到的profile屬性使用該配置文件,也可以通過page使用。
添加文本框以接受配置文件中定義的用戶輸入,並添加用於提交數據的按鈕:
更新頁面加載以顯示配置文件信息:
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!this.IsPostBack) { ProfileCommon pc=this.Profile.GetProfile(Profile.UserName); if (pc != null) { this.txtname.Text = pc.Name; this.txtaddr.Text = pc.Address.Street; this.txtcity.Text = pc.Address.City; this.txtstate.Text = pc.Address.State; this.txtzip.Text = pc.Address.Zipcode; this.Calendar1.SelectedDate = pc.Birthday; } } } }
爲提交按鈕編寫以下處理程序,以便將用戶數據保存到配置文件中:
protected void btnsubmit_Click(object sender, EventArgs e) { ProfileCommon pc=this.Profile.GetProfile(Profile.UserName); if (pc != null) { pc.Name = this.txtname.Text; pc.Address.Street = this.txtaddr.Text; pc.Address.City = this.txtcity.Text; pc.Address.State = this.txtstate.Text; pc.Address.Zipcode = this.txtzip.Text; pc.Birthday = this.Calendar1.SelectedDate; pc.Save(); } }
第一次執行頁面時,用戶需要輸入信息。但是,下次將自動加載用戶詳細信息。
Attributes for the <add> Element
除了我們使用的name和type屬性之外,<add>元素還有其他屬性。下表說明了其中一些屬性:
Attributes | Description |
---|---|
name | The name of the property. |
type | By default the type is string but it allows any fully qualified class name as data type. |
serializeAs | The format to use when serializing this value. |
readOnly | A read only profile value cannot be changed, by default this property is false. |
defaultValue | A default value that is used if the profile does not exist or does not have information. |
allowAnonymous | A Boolean value indicating whether this property can be used with the anonymous profiles. |
Provider | The profiles provider that should be used to manage just this property. |
Anonymous Personalization
匿名個性化允許用戶在識別自己之前對網站進行個性化設置。例如,Amazon.com允許用戶在登錄之前在購物車中添加商品。要啓用此功能,web.config文件可以配置爲:
<anonymousIdentification enabled ="true" cookieName=".ASPXANONYMOUSUSER" cookieTimeout="120000" cookiePath="/" cookieRequiresSSL="false" cookieSlidingExpiration="true" cookieprotection="Encryption" coolieless="UseDeviceProfile"/>
ASP.NET - Error Handling
ASP.NET中的錯誤處理有三個方面:
跟蹤-在頁面級或應用程式級跟蹤程序執行。
錯誤處理-在頁面級別或應用程式級別處理標準錯誤或自定義錯誤。
調試-單步執行程序,設置斷點以分析代碼
在本章中,我們將討論跟蹤和錯誤處理,在本章中,我們將討論調試。
要理解這些概念,請創建以下示例應用程式。它有一個標籤控制項、一個下拉列表和一個連結。下拉列表加載著名引號的數組列表,選定的引號顯示在下面的標籤中。它還有一個指向不存在連結的超連結。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="errorhandling._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Tracing, debugging and error handling </title> </head> <body> <form id="form1" runat="server"> <div> <asp:Label ID="lblheading" runat="server" Text="Tracing, Debuggin and Error Handling"> </asp:Label> <br /> <br /> <asp:DropDownList ID="ddlquotes" runat="server" AutoPostBack="True" onselectedindexchanged="ddlquotes_SelectedIndexChanged"> </asp:DropDownList> <br /> <br /> <asp:Label ID="lblquotes" runat="server"> </asp:Label> <br /> <br /> <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="mylink.htm">Link to:</asp:HyperLink> </div> </form> </body> </html>
代碼隱藏文件:
public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { string[,] quotes = { {"Imagination is more important than Knowledge.", "Albert Einsten"}, {"Assume a virtue, if you have it not" "Shakespeare"}, {"A man cannot be comfortable without his own approval", "Mark Twain"}, {"Beware the young doctor and the old barber", "Benjamin Franklin"}, {"Whatever begun in anger ends in shame", "Benjamin Franklin"} }; for (int i=0; i<quotes.GetLength(0); i++) ddlquotes.Items.Add(new ListItem(quotes[i,0], quotes[i,1])); } } protected void ddlquotes_SelectedIndexChanged(object sender, EventArgs e) { if (ddlquotes.SelectedIndex != -1) { lblquotes.Text = String.Format("{0}, Quote: {1}", ddlquotes.SelectedItem.Text, ddlquotes.SelectedValue); } } }
Tracing
要啓用頁級跟蹤,需要修改page指令並添加跟蹤屬性,如圖所示:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="errorhandling._Default" Trace ="true" %>
現在,當您執行該文件時,將獲得跟蹤信息:
它在頂部提供以下信息:
- Session ID
- Status Code
- Time of Request
- Type of Request
- Request and Response Encoding
從伺服器發送的狀態代碼,每次請求頁面時都會顯示錯誤的名稱和時間(如果有)。下表顯示了常見的HTTP狀態代碼:
Number | Description |
---|---|
Informational (100 - 199) | |
100 | Continue |
101 | Switching protocols |
Successful (200 - 299) | |
200 | OK |
204 | No content |
Redirection (300 - 399) | |
301 | Moved permanently |
305 | Use proxy |
307 | Temporary redirect |
顧客 Errors (400 - 499) | |
400 | Bad request |
402 | Payment required |
404 | Not found |
408 | Request timeout |
417 | Expectation failed |
伺服器 Errors (500 - 599) | |
500 | Internal server error |
503 | Service unavailable |
505 | HTTP version not supported |
在頂層信息下,有跟蹤日誌,它提供頁面生命周期的詳細信息。它提供自頁面初始化以來所用的時間(秒)。
下一部分是控制項樹,它以分層方式列出頁面上的所有控制項:
最後是會話和應用程式狀態摘要、cookies和headers集合,後面是所有伺服器變量的列表。
Trace對象允許您向跟蹤輸出添加自定義信息。它有兩種實現方法:Write方法和Warn方法。
更改頁面加載事件處理程序以檢查寫入方法:
protected void Page_Load(object sender, EventArgs e) { Trace.Write("Page Load"); if (!IsPostBack) { Trace.Write("Not Post Back, Page Load"); string[,] quotes = ....................... } }
跑步觀察效果:
要檢查Warn方法,讓我們在選定的索引更改事件處理程序中強制輸入一些錯誤代碼:
try { int a = 0; int b = 9 / a; } catch (Exception e) { Trace.Warn("UserAction", "processing 9/a", e); }
Try Catch是一個C#編程構造。try塊保存任何可能會或可能不會產生錯誤的代碼,catch塊捕獲錯誤。當程序運行時,它會在跟蹤日誌中發送警告。
應用程式級跟蹤應用於網站中的所有頁面。它是通過在web.config文件中放置以下代碼行來實現的:
<system.web> <trace enabled="true" /> </system.web>
Error Handling
儘管ASP.NET可以檢測到所有運行時錯誤,但仍然可能存在一些細微的錯誤。通過跟蹤觀察錯誤是爲了開發人員而不是用戶。
因此,要攔截此類事件,可以在應用程式的web.config文件中添加錯誤處理設置。它是應用程式範圍內的錯誤處理。例如,可以在web.config文件中添加以下行:
<configuration> <system.web> <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm"> <error statusCode="403" redirect="NoAccess.htm" /> <error statusCode="404" redirect="FileNotFound.htm" /> </customErrors> </system.web> <configuration>
<customErrors>部分具有可能的屬性:
模式:啓用或禁用自定義錯誤頁。它有三個可能的值:
- On : displays the custom pages.
- Off : displays ASP.NET error pages (yellow pages)
- remoteOnly : It displays custom errors to client, display ASP.NET errors locally.
defaultRedirect:它包含在出現未處理的錯誤時要顯示的頁面的URL。
要爲不同類型的錯誤放置不同的自定義錯誤頁,將使用子標記,其中根據錯誤的狀態代碼指定不同的錯誤頁。
要實現頁級錯誤處理,可以修改頁指令:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="errorhandling._Default" Trace ="true" ErrorPage="PageError.htm" %>
因爲ASP.NET調試本身就是一個重要的主題,所以我們將在下一章中分別討論它。
ASP.NET - Debugging
調試使開發人員能夠看到代碼是如何逐步工作的,變量值是如何變化的,對象是如何創建和銷毀的,等等。
首次執行站點時,Visual Studio將顯示一個提示,詢問是否應啓用該站點進行調試:
啓用調試時,web.config中顯示以下代碼行:
<system.web> <compilation debug="true"> <assemblies> .............. </assemblies> </compilation> </system.web>
「調試」工具欄提供了所有可用於調試的工具:
Breakpoints
斷點指定運行特定代碼行的運行時,然後停止執行,以便可以檢查代碼並執行各種調試作業,如更改變量值、單步執行代碼、移入/移出函數和方法等。
若要設置斷點,請右鍵單擊代碼並選擇「插入斷點」。左邊空白處出現一個紅點,代碼行突出顯示,如圖所示:
接下來執行代碼時,可以觀察其行爲。
在這個階段,您可以單步執行代碼,觀察執行流並檢查變量、屬性、對象等的值。
您可以從右鍵單擊斷點標誌符號獲得的「屬性」菜單中修改斷點的屬性:
「位置」對話框顯示文件的位置、行號和選定代碼的字符號。「條件」菜單項允許您輸入一個有效表達式,當程序執行到達斷點時計算該表達式:
點擊計數菜單項顯示一個對話框,顯示斷點執行的次數。
單擊下拉列表中顯示的任何選項將打開一個編輯欄位,在其中輸入目標命中計數。這對於分析代碼中的循環結構特別有用。
「篩選器」菜單項允許設置篩選器,以指定斷點將有效的計算機、進程、線程或任何組合。
點擊時菜單項允許您指定點擊斷點時要執行的操作。
The Debug Windows
Visual Studio提供了以下調試窗口,每個窗口都顯示一些程序信息。下表列出了窗口:
Window | Description |
---|---|
Immediate | Displays variables and expressions. |
Autos | Displays all variables in the current and previous statements. |
Locals | Displays all variables in the current context. |
Watch | Displays up to four different sets of variables. |
Call Stack | Displays all methods in the call stack. |
Threads | Displays and control threads. |
ASP.NET - LINQ
大多數應用程式是以數據爲中心的,但是大多數數據存儲庫是關係資料庫。多年來,設計人員和開發人員一直在基於對象模型設計應用程式。
這些對象負責連接到數據訪問組件,稱爲數據訪問層(DAL)。這裡我們有三點要考慮:
應用程式中所需的所有數據都不存儲在同一個源中。源可以是關係資料庫、某些業務對象、XML文件或web服務。
訪問內存中的對象比從資料庫或XML文件訪問數據更簡單、成本更低。
訪問的數據不是直接使用的,而是需要排序、排序、分組、更改等。
因此,如果有一種工具可以使所有類型的數據訪問變得容易,允許將來自這些不同數據源的數據連接起來,並執行標準的數據處理操作,只需幾行代碼,那將是非常有幫助的。
LINQ或語言集成查詢就是這樣一個工具。LINQ是.NETFramework3.5及其託管語言的一組擴展,這些語言將查詢設置爲對象。它定義了一個通用語法和一個編程模型來使用一種通用語言查詢不同類型的數據。
諸如Select、Project、Join、Group、Partition、Set操作等關係運算符是在LINQ中實現的,.Net framework 3.5中的C#和VB編譯器支持LINQ語法,因此無需藉助ADO.Net就可以使用已配置的數據存儲。
例如,查詢Northwind資料庫中的Customers表,使用C#中的LINQ查詢,代碼如下:
var data = from c in dataContext.Customers where c.Country == "Spain" select c;
哪裡:
「from」關鍵字在邏輯上循環遍歷集合的內容。
對集合中的每個對象計算具有「where」關鍵字的表達式。
「select」語句選擇要添加到返回列表中的計算對象。
「var」關鍵字用於變量聲明。由於返回對象的確切類型未知,它指示將動態推斷信息。
LINQ查詢可以應用於繼承自IEnumerable<T>的任何數據承載類,這裡T是任何數據類型,例如List<Book>。
讓我們看一個例子來理解這個概念。示例使用以下類:Books.cs
public class Books { public string ID {get; set;} public string Title { get; set; } public decimal Price { get; set; } public DateTime DateOfRelease { get; set; } public static List<Books> GetBooks() { List<Books> list = new List<Books>(); list.Add(new Books { ID = "001", Title = "Programming in C#", Price = 634.76m, DateOfRelease = Convert.ToDateTime("2010-02-05") }); list.Add(new Books { ID = "002", Title = "Learn Java in 30 days", Price = 250.76m, DateOfRelease = Convert.ToDateTime("2011-08-15") }); list.Add(new Books { ID = "003", Title = "Programming in ASP.Net 4.0", Price = 700.00m, DateOfRelease = Convert.ToDateTime("2011-02-05") }); list.Add(new Books { ID = "004", Title = "VB.Net Made Easy", Price = 500.99m, DateOfRelease = Convert.ToDateTime("2011-12-31") }); list.Add(new Books { ID = "005", Title = "Programming in C", Price = 314.76m, DateOfRelease = Convert.ToDateTime("2010-02-05") }); list.Add(new Books { ID = "006", Title = "Programming in C++", Price = 456.76m, DateOfRelease = Convert.ToDateTime("2010-02-05") }); list.Add(new Books { ID = "007", Title = "Datebase Developement", Price = 1000.76m, DateOfRelease = Convert.ToDateTime("2010-02-05") }); return list; } }
使用此類的網頁有一個簡單的標籤控制項,用於顯示書籍的標題。Page_Load事件創建書籍列表,並使用LINQ query返回標題:
public partial class simplequery : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { List<Books> books = Books.GetBooks(); var booktitles = from b in books select b.Title; foreach (var title in booktitles) lblbooks.Text += String.Format("{0} <br />", title); } }
執行頁面時,標籤將顯示查詢結果:
上面的LINQ表達式:
var booktitles = from b in books select b.Title;
相當於以下SQL查詢:
SELECT Title from Books
LINQ Operators
除了目前使用的運算符外,還有其他幾個運算符,它們實現了所有查詢子句。讓我們看看一些運算符和子句。
The Join clause
SQL中的「join子句」用於連接兩個數據表,並顯示包含兩個表中的列的數據集。LINQ也有能力做到這一點。要檢查此項,請在上一個項目中添加另一個名爲Saledetails.cs的類:
public class Salesdetails { public int sales { get; set; } public int pages { get; set; } public string ID {get; set;} public static IEnumerable<Salesdetails> getsalesdetails() { Salesdetails[] sd = { new Salesdetails { ID = "001", pages=678, sales = 110000}, new Salesdetails { ID = "002", pages=789, sales = 60000}, new Salesdetails { ID = "003", pages=456, sales = 40000}, new Salesdetails { ID = "004", pages=900, sales = 80000}, new Salesdetails { ID = "005", pages=456, sales = 90000}, new Salesdetails { ID = "006", pages=870, sales = 50000}, new Salesdetails { ID = "007", pages=675, sales = 40000}, }; return sd.OfType<Salesdetails>(); } }
在Page加載事件處理程序中添加代碼,以便使用join子句查詢兩個表:
protected void Page_Load(object sender, EventArgs e) { IEnumerable<Books> books = Books.GetBooks(); IEnumerable<Salesdetails> sales = Salesdetails.getsalesdetails(); var booktitles = from b in books join s in sales on b.ID equals s.ID select new { Name = b.Title, Pages = s.pages }; foreach (var title in booktitles) lblbooks.Text += String.Format("{0} <br />", title); }
結果頁面如下所示:
The Where clause
「where子句」允許向查詢添加一些條件篩選器。例如,如果要查看頁數超過500的書本,請將「頁面加載」事件處理程序更改爲:
var booktitles = from b in books join s in sales on b.ID equals s.ID where s.pages > 500 select new { Name = b.Title, Pages = s.pages };
查詢只返回那些頁數超過500的行:
Orderby and Orderbydescending Clauses
這些子句允許對查詢結果進行排序。要查詢按價格排序的書籍標題、頁數和價格,請在頁面加載事件處理程序中編寫以下代碼:
var booktitles = from b in books join s in sales on b.ID equals s.ID orderby b.Price select new { Name = b.Title, Pages = s.pages, Price = b.Price};
返回的元組是:
The Let clause
let子句允許定義一個變量並爲其分配一個根據數據值計算的值。例如,要計算上述兩個銷售的總銷售額,您需要計算:
TotalSale = Price of the Book * Sales
爲此,請在頁面加載事件處理程序中添加以下代碼段:
let子句允許定義一個變量並爲其分配一個根據數據值計算的值。例如,要計算上述兩個銷售的總銷售額,您需要計算:
var booktitles = from b in book join s in sales on b.ID equals s.ID let totalprofit = (b.Price * s.sales) select new { Name = b.Title, TotalSale = totalprofit};
生成的查詢頁面如下所示:
ASP.NET - Security
在站點中實現安全性有以下幾個方面:
身份驗證:這是確保用戶身份和真實性的過程。ASP.NET允許四種類型的身份驗證:
- Windows Authentication
- Forms Authentication
- Passport Authentication
- Custom Authentication
授權:它是定義特定角色並將其分配給特定用戶的過程。
機密性:它涉及對客戶端瀏覽器和web伺服器之間的通道進行加密。
完整性:它涉及維護數據的完整性。例如,實現數字簽名。
Forms-Based Authentication
傳統上,基於表單的身份驗證包括編輯web.config文件和添加帶有適當身份驗證代碼的登錄頁。
可以編輯web.config文件並在其上寫入以下代碼:
<configuration> <system.web> <authentication mode="Forms"> <forms loginUrl ="login.aspx"/> </authentication> <authorization> <deny users="?"/> </authorization> </system.web> ... ... </configuration>
上面代碼片段中提到的login.aspx頁面可能包含以下代碼隱藏文件,其中硬編碼了用於身份驗證的用戶名和密碼。
protected bool authenticate(String uname, String pass) { if(uname == "Tom") { if(pass == "tom123") return true; } if(uname == "Dick") { if(pass == "dick123") return true; } if(uname == "Harry") { if(pass == "har123") return true; } return false; } public void OnLogin(Object src, EventArgs e) { if (authenticate(txtuser.Text, txtpwd.Text)) { FormsAuthentication.RedirectFromLoginPage(txtuser.Text, chkrem.Checked); } else { Response.Write("Invalid user name or password"); } }
請注意,FormsAuthentication類負責身份驗證過程。
但是,Visual Studio允許您通過Web站點管理工具無縫輕鬆地實現用戶創建、身份驗證和授權,而無需編寫任何代碼。此工具允許創建用戶和角色。
除此之外,ASP.NET還提供了readymade登錄控制項集,其中包含爲您執行所有作業的控制項。
Implementing Forms-Based Security
要設置基於表單的身份驗證,您需要執行以下操作:
- A database of users to support the authentication process
- A website that uses the database
- User accounts
- Roles
- Restriction of users and group activities
- A default page, to display the login status of the users and other information.
- A login page, to allow users to log in, retrieve password, or change password
要創建用戶,請執行以下步驟:
步驟(1):選擇「網站」->「ASP.NET配置」打開「Web應用程式管理工具」。
步驟(2):單擊「安全」選項卡。
步驟(3):通過選擇「從Internet」單選按鈕,選擇「基於表單的身份驗證」的身份驗證類型。
步驟(4):單擊「創建用戶」連結創建一些用戶。如果已經創建了角色,則可以在此階段將角色分配給用戶。
步驟(5):創建網站並添加以下頁面:
- Welcome.aspx
- Login.aspx
- CreateAccount.aspx
- PasswordRecovery.aspx
- ChangePassword.aspx
步驟(6):從工具箱的「登錄」部分,在Welcome.aspx上放置一個LoginStatus控制項。它有兩個模板:LoggedIn和LoggedOut。
在LoggedOut模板中,有一個登錄連結,在LoggedIn模板中,控制項上有一個註銷連結。可以從「屬性」窗口更改控制項的登錄和註銷文本屬性。
步驟(7):將工具箱中的LoginView控制項放在LoginStatus控制項下面。在這裡,您可以放置文本和其他控制項(超連結、按鈕等),這些控制項根據用戶是否登錄而顯示。
此控制項有兩個視圖模板:匿名模板和LoggedIn模板。選擇每個視圖並爲每個模板顯示的用戶編寫一些文本。文本應放在標有紅色的區域。
步驟(8):應用程式的用戶由開發人員創建。您可能希望允許訪問者創建用戶帳戶。爲此,請在LoginView控制項下添加連結,該控制項應連結到CreateAccount.aspx頁。
步驟(9):在「創建帳戶」頁上放置CreateUserWizard控制項。將此控制項的ContinueDestinationPageUrl屬性設置爲Welcome.aspx。
步驟(10):創建登錄頁。在頁面上放置登錄控制項。LoginStatus控制項自動連結到Login.aspx。要更改此默認值,請在web.config文件中進行以下更改。
例如,如果要將登錄頁命名爲signup.aspx,請將以下行添加到web.config的「身份驗證」部分:
<configuration> <system.web> <authentication mode="Forms"> <forms loginUrl ="signup.aspx" defaultUrl = “Welcome.aspx†/> </authentication> </system.web> </configuration>
步驟(11):用戶經常忘記密碼。PasswordRecovery控制項幫助用戶訪問帳戶。選擇登錄控制項。打開其智能標記並單擊「轉換爲模板」。
自定義控制項的UI以在「登錄」按鈕下放置超連結控制項,該按鈕應連結到PassWordRecovery.aspx。
步驟(12):在「密碼恢復」頁上放置密碼恢復控制項。此控制項需要電子郵件伺服器將密碼發送給用戶。
步驟(13):在Welcome.aspx中的LoginView控制項的LoggedIn模板中創建到ChangePassword.aspx頁的連結。
步驟(14):在「更改密碼」頁上放置「更改密碼」控制項。此控制項還有兩個視圖。
現在運行應用程式並觀察不同的安全操作。
要創建角色,請返回Web應用程式管理工具並單擊「安全性」選項卡。單擊「創建角色」並爲應用程式創建一些角色。
單擊「管理用戶」連結並爲用戶分配角色。
IIS Authentication: SSL
安全套接字層或SSL是用於確保安全連接的協議。啓用SSL後,瀏覽器將加密發送到伺服器的所有數據,並解密來自伺服器的所有數據。同時,伺服器對進出瀏覽器的所有數據進行加密和解密。
安全連接的URL以HTTPS而不是HTTP開頭。瀏覽器使用安全連接顯示小鎖。當瀏覽器首次嘗試通過使用SSL的安全連接與伺服器通信時,伺服器通過發送其數字證書進行身份驗證。
要使用SSL,需要從可信證書頒發機構(CA)購買數字安全證書並將其安裝到web伺服器中。以下是一些受信任和聲譽良好的證書頒發機構:
- www.verisign.com
- www.geotrust.com
- www.thawte.com
SSL內置於所有主要的瀏覽器和伺服器中。要啓用SSL,需要安裝數字證書。各種數字證書的強度取決於加密過程中生成的密鑰的長度。長度越長,證書就越安全,因此連接也就越安全。
Strength | Description |
---|---|
40 bit | Supported by most browsers but easy to break. |
56 bit | Stronger than 40-bit. |
128 bit | Extremely difficult to break but all the browsers do not support it. |
ASP.NET - Data Caching
What is Caching?
緩存是一種將經常使用的數據/信息存儲在內存中的技術,以便下次需要相同的數據/信息時,可以直接從內存中檢索,而不是由應用程式生成。
緩存對於提高ASP.NET的性能非常重要,因爲頁面和控制項是在這裡動態生成的。對於與數據相關的事務尤其重要,因爲這些事務在響應時間方面非常昂貴。
緩存將常用數據放在快速訪問的媒體中,如計算機的隨機訪問內存。NET運行時包含名爲緩存的CLR對象的鍵值映射。它位於應用程式中,可通過HttpContext和System.Web.UI.Page獲得。
在某些方面,緩存類似於存儲狀態對象。然而,在狀態對象中存儲信息是確定的,也就是說,您可以依賴存儲在其中的數據,並且數據的緩存是不確定的。
在下列情況下,數據將不可用:
- If its lifetime expires,
- If the application releases its memory,
- If caching does not take place for some reason.
可以使用索引器訪問緩存中的項,還可以控制緩存中對象的生存期,並在緩存對象及其物理源之間設置連結。
Caching in ASP.Net
ASP.NET提供以下不同類型的緩存:
輸出緩存:輸出緩存存儲最終呈現的HTML頁面的副本或發送到客戶端的部分頁面。當下一個客戶端請求此頁時,將發送該頁的緩存副本,而不是重新生成該頁,從而節省時間。
數據緩存:數據緩存是指從數據源緩存數據。只要緩存未過期,就將從緩存中完成對數據的請求。當緩存過期時,數據源將獲取新數據並重新填充緩存。
對象緩存:對象緩存是緩存頁面上的對象,如數據綁定控制項。緩存的數據存儲在伺服器內存中。
類緩存:首次運行時,網頁或Web服務被編譯爲程序集中的頁類。然後程序集緩存在伺服器中。下次對頁或服務發出請求時,將引用緩存的程序集。當原始碼更改時,CLR重新編譯程序集。
配置緩存:應用程式範圍的配置信息存儲在配置文件中。配置緩存將配置信息存儲在伺服器內存中。
在本教程中,我們將考慮輸出緩存、數據緩存和對象緩存。
Output Caching
呈現頁面可能涉及一些複雜的過程,如資料庫訪問、呈現複雜的控制項等。輸出緩存允許通過在內存中緩存數據繞過到伺服器的往返行程。甚至整個頁面都可以被緩存。
OutputCache指令負責輸出緩存。它啓用輸出緩存並對其行爲提供一定的控制。
OutputCache指令的語法:
<%@ OutputCache Duration="15" VaryByParam="無" %>
將此指令置於page指令下。這告訴環境將頁面緩存15秒。下面的頁面加載事件處理程序將有助於測試頁面是否已真正緩存。
protected void Page_Load(object sender, EventArgs e) { Thread.Sleep(10000); Response.Write("This page was generated and cache at:" + DateTime.Now.ToString()); }
Thread.Sleep()方法在指定的時間內停止進程線程。在這個例子中,線程被停止10秒,所以當第一次加載頁面時,它需要10秒。但是,下次刷新頁面時不需要任何時間,因爲頁面是從緩存中檢索而不加載的。
output cache指令具有以下屬性,有助於控制輸出緩存的行爲:
Attribute | Values | Description |
---|---|---|
DiskCacheable | true/false | Specifies that output could be written to a disk based cache. |
NoStore | true/false | Specifies that the "no store" cache control header is sent or not. |
CacheProfile | String name | Name of a cache profile as to be stored in web.config. |
VaryByParam |
無 * Param- name |
Semicolon delimited list of string specifies query string values in a GET request or variable in a POST request. |
VaryByHeader |
* 標題名稱 |
Semicolon delimited list of strings specifies headers that might be submitted by a client. |
VaryByCustom |
瀏覽器 自定義字符串 |
Tells ASP.NET to vary the output cache by browser name and version or by a custom string. |
Location |
任何 顧客 下游 伺服器 無 |
任何: page may be cached anywhere. 顧客: cached content remains at browser. 下游: cached content stored in downstream and server both. 伺服器: cached content saved only on server. 無: disables caching. |
Duration | Number | Number of seconds the page or control is cached. |
讓我們在前面的示例中添加一個文本框和一個按鈕,並爲該按鈕添加此事件處理程序。
protected void btnmagic_Click(object sender, EventArgs e) { Response.Write("<br><br>"); Response.Write("<h2> Hello, " + this.txtname.Text + "</h2>"); }
更改OutputCache指令:
<%@ OutputCache Duration="60" VaryByParam="txtname" %>
當程序執行時,ASP.NET會根據文本框中的名稱緩存頁面。
Data Caching
數據緩存的主要方面是緩存數據源控制項。我們已經討論過數據源控制項表示數據源中的數據,如資料庫或XML文件。這些控制項派生自抽象類DataSourceControl,並具有以下用於實現緩存的繼承屬性:
CacheDuration-它設置數據源緩存數據的秒數。
CacheExpirationPolicy-它定義緩存中的數據過期時的緩存行爲。
cachekeypendency-它標識控制項的鍵,該控制項在移除緩存內容時自動過期。
EnableCaching-它指定是否緩存數據。
Example
要演示數據緩存,請創建一個新網站並在其上添加一個新的web表單。使用數據訪問教程中已使用的資料庫連接添加SqlDataSource控制項。
對於本例,向頁面添加一個標籤,該標籤將顯示頁面的響應時間。
<asp:Label ID="lbltime" runat="server"></asp:Label>
除了標籤之外,內容頁與數據訪問教程中的內容頁相同。爲頁面加載事件添加事件處理程序:
protected void Page_Load(object sender, EventArgs e) { lbltime.Text = String.Format("Page posted at: {0}", DateTime.Now.ToLongTimeString()); }
設計的頁面應如下所示:
當您第一次執行頁面時,沒有發生任何不同的情況,標籤顯示,每次刷新頁面時,頁面都會重新加載,並且標籤上顯示的時間也會更改。
接下來,將數據源控制項的EnableCaching屬性設置爲「true」,並將Cacheduration屬性設置爲「60」。它將實現緩存,緩存將每60秒過期一次。
時間戳隨每次刷新而變化,但如果在這60秒內更改表中的數據,則在緩存過期之前不會顯示。
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings: ASPDotNetStepByStepConnectionString %>" ProviderName="<%$ ConnectionStrings: ASPDotNetStepByStepConnectionString.ProviderName %>" SelectCommand="SELECT * FROM [DotNetReferences]" EnableCaching="true" CacheDuration = "60"> </asp:SqlDataSource>
Object Caching
對象緩存比其他緩存技術提供了更大的靈活性。可以使用對象緩存在緩存中放置任何對象。對象可以是任何類型-數據類型、web控制項、類、數據集對象等。只需分配一個新的密鑰名,即可將該項添加到緩存中,如下所示:
Cache["key"] = item;
NET還提供了Insert()方法,用於將對象插入緩存。此方法有四個重載版本。讓我們看看:
Overload | Description |
---|---|
Cache.Insert((key, value); | Inserts an item into the cache with the key name and value with default priority and expiration. |
Cache.Insert(key, value, dependencies); | Inserts an item into the cache with key, value, default priority, expiration and a CacheDependency name that links to other files or items so that when these change the cache item remains no longer valid. |
Cache.Insert(key, value, dependencies, absoluteExpiration, slidingExpiration); | This indicates an expiration policy along with the above issues. |
Cache.Insert(key, value, dependencies, absoluteExpiration, slidingExpiration, priority, onRemoveCallback); | This along with the parameters also allows you to set a priority for the cache item and a delegate that, points to a method to be invoked when the item is removed. |
滑動過期用於在指定的時間範圍內不使用項時從緩存中刪除該項。下面的代碼片段存儲了一個滑動過期時間爲10分鐘且不存在依賴項的項。
Cache.Insert("my_item", obj, null, DateTime.MaxValue, TimeSpan.FromMinutes(10));
Example
創建一個只有按鈕和標籤的頁面。在頁面加載事件中編寫以下代碼:
protected void Page_Load(object sender, EventArgs e) { if (this.IsPostBack) { lblinfo.Text += "Page Posted Back.<br/>"; } else { lblinfo.Text += "page Created.<br/>"; } if (Cache["testitem"] == null) { lblinfo.Text += "Creating test item.<br/>"; DateTime testItem = DateTime.Now; lblinfo.Text += "Storing test item in cache "; lblinfo.Text += "for 30 seconds.<br/>"; Cache.Insert("testitem", testItem, null, DateTime.Now.AddSeconds(30), TimeSpan.Zero); } else { lblinfo.Text += "Retrieving test item.<br/>"; DateTime testItem = (DateTime)Cache["testitem"]; lblinfo.Text += "Test item is: " + testItem.ToString(); lblinfo.Text += "<br/>"; } lblinfo.Text += "<br/>"; }
當第一次加載頁面時,它會顯示:
Page Created. Creating test item. Storing test item in cache for 30 seconds.
如果在30秒內再次單擊該按鈕,則頁面將被回發,但label控制項將從緩存獲取其信息,如圖所示:
Page Posted Back. Retrieving test item. Test item is: 14-07-2010 01:25:04
ASP.NET - Web Services
web服務是一種基於web的功能,它使用web應用程式要使用的web協議來訪問。web服務開發有三個方面:
- Creating the web service
- Creating a proxy
- Consuming the web service
Creating a Web Service
web服務是一個web應用程式,它基本上是一個類,由其他應用程式可以使用的方法組成。它還遵循代碼隱藏架構(如ASP.NET網頁),儘管它沒有用戶界面。
爲了理解這個概念,讓我們創建一個web服務來提供股票價格信息。客戶可以根據股票符號查詢股票的名稱和價格。爲了使這個例子簡單,這些值在二維數組中硬編碼。此web服務有三種方法:
- A default HelloWorld method
- A GetName Method
- A GetPrice Method
請執行以下步驟創建web服務:
步驟(1):在Visual Studio中選擇「文件」->「新建」->「網站」,然後選擇「ASP.NET Web服務」。
步驟(2):在項目的App_code目錄中創建名爲service.asmx的web服務文件及其代碼隱藏文件service.cs。
步驟(3):將文件名更改爲StockService.asmx和StockService.cs。
步驟(4):asmx文件上只有一個WebService指令:
<%@ WebService Language="C#" CodeBehind="~/App_Code/StockService.cs" Class="StockService" %>
步驟(5):打開StockService.cs文件,其中生成的代碼是基本的Hello World服務。默認的web服務代碼隱藏文件如下所示:
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Linq; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; using System.Xml.Linq; namespace StockService { // <summary> // Summary description for Service1 // <summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [ToolboxItem(false)] // To allow this Web Service to be called from script, // using ASP.NET AJAX, uncomment the following line. // [System.Web.Script.Services.ScriptService] public class Service1 : System.Web.Services.WebService { [WebMethod] public string HelloWorld() { return "Hello World"; } } }
步驟(6):更改代碼隱藏文件以添加股票符號、名稱和價格的二維字符串數組以及獲取股票信息的兩個web方法。
using System; using System.Linq; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; using System.Xml.Linq; [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] // To allow this Web Service to be called from script, // using ASP.NET AJAX, uncomment the following line. // [System.Web.Script.Services.ScriptService] public class StockService : System.Web.Services.WebService { public StockService () { //Uncomment the following if using designed components //InitializeComponent(); } string[,] stocks = { {"RELIND", "Reliance Industries", "1060.15"}, {"ICICI", "ICICI Bank", "911.55"}, {"JSW", "JSW Steel", "1201.25"}, {"WIPRO", "Wipro Limited", "1194.65"}, {"SATYAM", "Satyam Computers", "91.10"} }; [WebMethod] public string HelloWorld() { return "Hello World"; } [WebMethod] public double GetPrice(string symbol) { //it takes the symbol as parameter and returns price for (int i = 0; i < stocks.GetLength(0); i++) { if (String.Compare(symbol, stocks[i, 0], true) == 0) return Convert.ToDouble(stocks[i, 2]); } return 0; } [WebMethod] public string GetName(string symbol) { // It takes the symbol as parameter and // returns name of the stock for (int i = 0; i < stocks.GetLength(0); i++) { if (String.Compare(symbol, stocks[i, 0], true) == 0) return stocks[i, 1]; } return "Stock Not Found"; } }
步驟(7):運行web服務應用程式將提供一個web服務測試頁,該頁允許測試服務方法。
步驟(8):單擊方法名,檢查它是否正常運行。
步驟(9):要測試GetName方法,請提供一個經過硬編碼的股票符號,它將返回股票的名稱
Consuming the Web Service
要使用web服務,請在同一解決方案下創建網站。這可以通過右鍵單擊解決方案資源管理器中的解決方案名稱來完成。調用web服務的web頁面應該有一個label控制項來顯示返回的結果,還有兩個按鈕控制項,一個用於回發,另一個用於調用服務。
web應用程式的內容文件如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="wsclient._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Untitled Page </title> </head> <body> <form id="form1" runat="server"> <div> <h3>Using the Stock Service</h3> <br /> <br /> <asp:Label ID="lblmessage" runat="server"></asp:Label> <br /> <br /> <asp:Button ID="btnpostback" runat="server" onclick="Button1_Click" Text="Post Back" style="width:132px" /> <asp:Button ID="btnservice" runat="server onclick="btnservice_Click" Text="Get Stock" style="width:99px" /> </div> </form> </body> </html>
web應用程式的代碼隱藏文件如下:
using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; //this is the proxy using localhost; namespace wsclient { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { lblmessage.Text = "First Loading Time: " + DateTime.Now.ToLongTimeString } else { lblmessage.Text = "PostBack at: " + DateTime.Now.ToLongTimeString(); } } protected void btnservice_Click(object sender, EventArgs e) { StockService proxy = new StockService(); lblmessage.Text = String.Format("Current SATYAM Price:{0}", proxy.GetPrice("SATYAM").ToString()); } } }
Creating the Proxy
代理是web服務代碼的代理。在使用web服務之前,必須創建代理。代理已在客戶端應用程式中註冊。然後客戶端應用程式使用本地方法調用web服務。
代理接受調用,將其包裝成適當的格式,並將其作爲SOAP請求發送到伺服器。SOAP代表簡單對象訪問協議。此協議用於交換web服務數據。
當伺服器將SOAP包返回給客戶端時,代理將解碼所有內容並將其呈現給客戶端應用程式。
在使用btnservice_Click調用web服務之前,應該向應用程式添加一個web引用。這將透明地創建一個代理類,由btnservice_Click事件使用。
protected void btnservice_Click(object sender, EventArgs e) { StockService proxy = new StockService(); lblmessage.Text = String.Format("Current SATYAM Price: {0}", proxy.GetPrice("SATYAM").ToString()); }
按照以下步驟創建代理:
步驟(1):右鍵單擊解決方案資源管理器中的web應用程式條目,然後單擊「添加web引用」。
步驟(2):選擇「此解決方案中的Web服務」。它返回StockService引用。
步驟(3):單擊服務將打開測試網頁。默認情況下,創建的代理稱爲「localhost」,您可以重命名它。單擊「添加引用」將代理添加到客戶端應用程式。
通過添加以下內容將代理包含在代碼隱藏文件中:
using localhost;
ASP.NET - Multi Threading
線程被定義爲程序的執行路徑。每個線程定義一個唯一的控制流。如果應用程式涉及複雜且耗時的操作(如資料庫訪問或某些密集的I/O操作),那麼設置不同的執行路徑或線程(每個線程執行特定的作業)通常會很有幫助。
線程是輕量級進程。使用線程的一個常見例子是用現代作業系統實現並發編程。使用線程可以節省CPU周期的浪費,並提高應用程式的效率。
到目前爲止,我們編譯的程序中,一個線程作爲一個進程運行,這個進程是應用程式的運行實例。但是,這樣應用程式可以一次執行一個作業。爲了使它一次執行多個任務,可以將它劃分爲更小的線程。
在.Net中,線程是通過「System.threading」命名空間處理的。通過創建System.Threading.Thread類型的變量,可以創建一個新的開始使用的線程。它允許您在程序中創建和訪問單個線程。
Creating Thread
線程是通過創建線程對象創建的,爲其構造函數提供一個ThreadStart引用。
ThreadStart childthreat = new ThreadStart(childthreadcall);
Thread Life Cycle
線程的生命周期從System.Threading.thread類的對象創建時開始,到線程終止或完成執行時結束。
以下是線程生命周期中的各種狀態:
未啓動狀態:創建線程實例但未調用Start方法時的情況。
就緒狀態:線程準備好執行並等待CPU周期的情況。
不可運行狀態:線程不可運行,當:
- Sleep method has been called
- Wait method has been called
- Blocked by I/O operations
死區狀態:線程已完成執行或已中止的情況。
Thread Priority
Thread類的Priority屬性指定一個線程相對於另一個線程的優先級。.Net運行時選擇優先級最高的就緒線程。
優先事項可分爲:
- Above normal
- Below normal
- Highest
- Lowest
- Normal
創建線程後,將使用thread類的priority屬性設置其優先級。
NewThread.Priority = ThreadPriority.Highest;
Thread Properties & Methods
Thread類具有以下重要屬性:
Property | Description |
---|---|
CurrentContext | Gets the current context in which the thread is executing. |
CurrentCulture | Gets or sets the culture for the current thread. |
CurrentPrinciple | Gets or sets the thread's current principal for role-based security. |
CurrentThread | Gets the currently running thread. |
CurrentUICulture | Gets or sets the current culture used by the Resource Manager to look up culture-specific resources at run time. |
ExecutionContext | Gets an ExecutionContext object that contains information about the various contexts of the current thread. |
IsAlive | Gets a value indicating the execution status of the current thread. |
IsBackground | Gets or sets a value indicating whether or not a thread is a background thread. |
IsThreadPoolThread | Gets a value indicating whether or not a thread belongs to the managed thread pool. |
ManagedThreadId | Gets a unique identifier for the current managed thread. |
Name | Gets or sets the name of the thread. |
Priority | Gets or sets a value indicating the scheduling priority of a thread. |
ThreadState | Gets a value containing the states of the current thread. |
Thread類有以下重要方法:
Methods | Description |
---|---|
Abort | Raises a ThreadAbortException in the thread on which it is invoked, to begin the process of terminating the thread. Calling this method usually terminates the thread. |
AllocateDataSlot | Allocates an unnamed data slot on all the threads. For better performance, use fields that are marked with the ThreadStaticAttribute attribute instead. |
AllocateNamedDataSlot | Allocates a named data slot on all threads. For better performance, use fields that are marked with the ThreadStaticAttribute attribute instead. |
BeginCriticalRegion | Notifies a host that execution is about to enter a region of code in which the effects of a thread abort or unhandled exception might endanger other tasks in the application domain. |
BeginThreadAffinity | Notifies a host that managed code is about to execute instructions that depend on the identity of the current physical operating system thread. |
EndCriticalRegion | Notifies a host that execution is about to enter a region of code in which the effects of a thread abort or unhandled exception are limited to the current task. |
EndThreadAffinity | Notifies a host that managed code has finished executing instructions that depend on the identity of the current physical operating system thread. |
FreeNamedDataSlot | Eliminates the association between a name and a slot, for all threads in the process. For better performance, use fields that are marked with the ThreadStaticAttribute attribute instead. |
GetData | Retrieves the value from the specified slot on the current thread, within the current thread's current domain. For better performance, use fields that are marked with the ThreadStaticAttribute attribute instead. |
GetDomain | Returns the current domain in which the current thread is running. |
GetDomainID | Returns a unique application domain identifier. |
GetNamedDataSlot | Looks up a named data slot. For better performance, use fields that are marked with the ThreadStaticAttribute attribute instead. |
Interrupt | Interrupts a thread that is in the WaitSleepJoin thread state. |
Join | Blocks the calling thread until a thread terminates, while continuing to perform standard COM and SendMessage pumping. This method has different overloaded forms. |
MemoryBarrier | Synchronizes memory access as follows: The processor executing the current thread cannot reorder instructions in such a way that memory accesses prior to the call to MemoryBarrier execute after memory accesses that follow the call to MemoryBarrier. |
ResetAbort | Cancels an Abort requested for the current thread. |
SetData | Sets the data in the specified slot on the currently running thread, for that thread's current domain. For better performance, use fields marked with the ThreadStaticAttribute attribute instead. |
Start | Starts a thread. |
Sleep | Makes the thread pause for a period of time. |
SpinWait | Causes a thread to wait the number of times defined by the iterations parameter. |
VolatileRead() | Reads the value of a field. The value is the latest written by any processor in a computer, regardless of the number of processors or the state of processor cache. This method has different overloaded forms. |
VolatileWrite() | Writes a value to a field immediately, so that the value is visible to all processors in the computer. This method has different overloaded forms. |
Yield | Causes the calling thread to yield execution to another thread that is ready to run on the current processor. The operating system selects the thread to yield to. |
Example
下面的示例演示了Thread類的用法。頁面有一個標籤控制項,用於顯示來自子線程的消息。使用Response.Write()方法直接顯示來自主程序的消息。因此它們出現在頁面的頂部。
源文件如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="threaddemo._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Untitled Page </title> </head> <body> <form id="form1" runat="server"> <div> <h3>Thread Example</h3> </div> <asp:Label ID="lblmessage" runat="server" Text="Label"> </asp:Label> </form> </body> </html>
代碼隱藏文件如下:
using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; using System.Threading; namespace threaddemo { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { ThreadStart childthreat = new ThreadStart(childthreadcall); Response.Write("Child Thread Started <br/>"); Thread child = new Thread(childthreat); child.Start(); Response.Write("Main sleeping for 2 seconds.......<br/>"); Thread.Sleep(2000); Response.Write("<br/>Main aborting child thread<br/>"); child.Abort(); } public void childthreadcall() { try{ lblmessage.Text = "<br />Child thread started <br/>"; lblmessage.Text += "Child Thread: Coiunting to 10"; for( int i =0; i<10; i++) { Thread.Sleep(500); lblmessage.Text += "<br/> in Child thread </br>"; } lblmessage.Text += "<br/> child thread finished"; } catch(ThreadAbortException e) { lblmessage.Text += "<br /> child thread - exception"; } finally{ lblmessage.Text += "<br /> child thread - unable to catch the exception"; } } } }
Observe the following
加載頁時,將使用childthreadcall()方法的引用啓動新線程。主線程活動直接顯示在網頁上。
第二個線程運行並向label控制項發送消息。
主線程休眠2000毫秒,在此期間執行子線程。
子線程一直運行到被主線程中止爲止。它引發ThreadAbortException並被終止。
控制項返回到主線程。
執行時,程序發送以下消息:
ASP.NET - Configuration
ASP.NET應用程式的行爲受配置文件中不同設置的影響:
- machine.config
- web.config
machine.config文件包含所有支持設置的默認值和特定於計算機的值。計算機設置由系統管理員控制,應用程式通常無權訪問此文件。
但是,應用程式可以通過在根文件夾中創建web.config文件來覆蓋默認值。web.config文件是machine.config文件的一個子集。
如果應用程式包含子目錄,它可以爲每個文件夾定義一個web.config文件。每個配置文件的範圍是以自上而下的分層方式確定的。
任何 web.config file can locally extend, restrict, or override any settings defined on the upper level.
Visual Studio爲每個項目生成默認的web.config文件。應用程式可以在沒有web.config文件的情況下執行,但是,不能在沒有web.config文件的情況下調試應用程式。
下圖顯示了web服務教程中使用的示例的解決方案資源管理器:
在這個應用程式中,有兩個web.config文件用於兩個項目,即web服務和調用web服務的網站。
web.config文件將configuration元素作爲根節點。此元素中的信息分爲兩個主要區域:配置節處理程序聲明區域和配置節設置區域。
以下代碼段顯示了配置文件的基本語法:
<configuration> <!-- Configuration section-handler declaration area. --> <configSections> <section name="section1" type="section1Handler" /> <section name="section2" type="section2Handler" /> </configSections> <!-- Configuration section settings area. --> <section1> <s1Setting1 attribute1="attr1" /> </section1> <section2> <s2Setting1 attribute1="attr1" /> </section2> <system.web> <authentication mode="Windows" /> </system.web> </configuration>
Configuration Section Handler declarations
該配置截面手柄在配置<>標籤內容納。每一個配置手柄特徵的名稱,包含在文件內,提供一些配置數據。下面是基本語法:
<configSections> <section /> <sectionGroup /> <remove /> <clear/> </configSections>
它具有以下要素:
清除-刪除對繼承節和節組的所有引用。
刪除-它刪除對繼承的節和節組的引用。
節-它定義配置節處理程序和配置元素之間的關聯。
節組-它定義配置節處理程序和配置節之間的關聯。
Application Settings
應用程式設置允許存儲應用程式範圍的名稱-值對以進行只讀訪問。例如,可以將自定義應用程式設置定義爲:
<configuration> <appSettings> <add key="Application Name" value="MyApplication" /> </appSettings> </configuration>
例如,您還可以存儲圖書的名稱及其ISBN號:
<configuration> <appSettings> <add key="appISBN" value="0-273-68726-3" /> <add key="appBook" value="Corporate Finance" /> </appSettings> </configuration>
Connection Strings
連接字符串顯示哪些資料庫連接字符串可用於網站。例如:
<connectionStrings> <add name="ASPDotNetStepByStepConnectionString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0; Data Source=E:\\projects\datacaching\ / datacaching\App_Data\ASPDotNetStepByStep.mdb" providerName="System.Data.OleDb" /> <add name="booksConnectionString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\ \databinding\App_Data\books.mdb" providerName="System.Data.OleDb" /> </connectionStrings>
System.Web Element
system.web元素指定ASP.NET配置節的根元素,並包含配置ASP.NET web應用程式和控制應用程式行爲的配置元素。
它保存了大多數需要在公共應用程式中調整的配置元素。元素的基本語法如下所示:
<system.web> <anonymousIdentification> <authentication> <authorization> <browserCaps> <caching> <clientTarget> <compilation> <customErrors> <deployment> <deviceFilters> <globalization> <healthMonitoring> <hostingEnvironment> <httpCookies> <httpHandlers> <httpModules> <httpRuntime> <identity> <machineKey> <membership> <mobileControls> <pages> <processModel> <profile> <roleManager> <securityPolicy> <sessionPageState> <sessionState> <siteMap> <trace> <trust> <urlMappings> <webControls> <webParts> <webServices> <xhtmlConformance> </system.web>
下表簡要介紹了system.web元素的一些常見子元素:
AnonymousIdentification
當需要授權時,這是識別未經身份驗證的用戶所必需的。
Authentication
它配置身份驗證支持。基本語法如下:
<authentication mode="[Windows|Forms|Passport|無]"> <forms>...</forms> <passport/> </authentication>
Authorization
它配置授權支持。基本語法如下:
<authorization> <allow .../> <deny .../> </authorization>
Caching
它配置緩存設置。基本語法如下:
<caching> <cache>...</cache> <outputCache>...</outputCache> <outputCacheSettings>...</outputCacheSettings> <sqlCacheDependency>...</sqlCacheDependency> </caching>
CustomErrors
它定義自定義錯誤消息。基本語法如下:
<customErrors defaultRedirect="url" mode="On|Off|RemoteOnly"> <error. . ./> </customErrors>
Deployment
它定義用於部署的配置設置。基本語法如下:
<deployment retail="true|false" />
HostingEnvironment
它定義宿主環境的配置設置。基本語法如下:
<hostingEnvironment idleTimeout="HH:MM:SS" shadowCopyBinAssemblies="true|false" shutdownTimeout="number" urlMetadataSlidingExpiration="HH:MM:SS" />
Identity
它配置應用程式的標識。基本語法如下:
<identity impersonate="true|false" userName="domain\username" password="<secure password>"/>
MachineKey
它配置用於表單身份驗證cookie數據加密和解密的密鑰。
它還允許配置驗證密鑰,對視圖狀態數據和表單驗證票證執行消息驗證檢查。基本語法是:
<machineKey validationKey="AutoGenerate,IsolateApps" [String] decryptionKey="AutoGenerate,IsolateApps" [String] validation="HMACSHA256" [SHA1 | MD5 | 3DES | AES | HMACSHA256 | HMACSHA384 | HMACSHA512 | alg:algorithm_name] decryption="Auto" [Auto | DES | 3DES | AES | alg:algorithm_name] />
Membership
這將配置管理和驗證用戶帳戶的參數。基本語法是:
<membership defaultProvider="provider name" userIsOnlineTimeWindow="number of minutes" hashAlgorithmType="SHA1"> <providers>...</providers> </membership>
Pages
它提供特定於頁面的配置。基本語法是:
<pages asyncTimeout="number" autoEventWireup="[True|False]" buffer="[True|False]" clientIDMode="[AutoID|Predictable|Static]" compilationMode="[Always|Auto|Never]" controlRenderingCompatibilityVersion="[3.5|4.0]" enableEventValidation="[True|False]" enableSessionState="[True|False|ReadOnly]" enableViewState="[True|False]" enableViewStateMac="[True|False]" maintainScrollPositionOnPostBack="[True|False]" masterPageFile="file path" maxPageStateFieldLength="number" pageBaseType="typename, assembly" pageParserFilterType="string" smartNavigation="[True|False]" styleSheetTheme="string" theme="string" userControlBaseType="typename" validateRequest="[True|False]" viewStateEncryptionMode="[Always|Auto|Never]" > <controls>...</controls> <namespaces>...</namespaces> <tagMapping>...</tagMapping> <ignoreDeviceFilters>...</ignoreDeviceFilters> </pages>
Profile
它配置用戶配置文件參數。基本語法是:
<profile enabled="true|false" inherits="fully qualified type reference" automaticSaveEnabled="true|false" defaultProvider="provider name"> <properties>...</properties> <providers>...</providers> </profile>
RoleManager
它配置用戶角色的設置。基本語法是:
<roleManager cacheRolesInCookie="true|false" cookieName="name" cookiePath="/" cookieProtection="All|Encryption|Validation|無" cookieRequireSSL="true|false " cookieSlidingExpiration="true|false " cookieTimeout="number of minutes" createPersistentCookie="true|false" defaultProvider="provider name" domain="cookie domain"> enabled="true|false" maxCachedResults="maximum number of role names cached" <providers>...</providers> </roleManager>
SecurityPolicy
它配置安全策略。基本語法是:
<securityPolicy> <trustLevel /> </securityPolicy>
UrlMappings
它定義了映射以隱藏原始URL並提供更方便用戶的URL。基本語法是:
<urlMappings enabled="true|false"> <add.../> <clear /> <remove.../> </urlMappings>
WebControls
它爲客戶端腳本提供共享位置的名稱。基本語法是:
<webControls clientScriptsLocation="String" />
WebServices
這將配置web服務。
ASP.NET - Deployment
有兩類ASP.NET部署:
本地部署:在這種情況下,整個應用程式都包含在一個虛擬目錄中,所有內容和程序集都包含在其中並可供應用程式使用。
全局部署:在這種情況下,伺服器上運行的每個應用程式都可以使用程序集。
有不同的部署技術,但是,我們將討論以下最常見和最簡單的部署方法:
- XCOPY deployment
- Copying a Website
- Creating a set up project
XCOPY Deployment
XCOPY部署意味著將所有文件遞歸複製到目標計算機上的目標文件夾。您可以使用任何常用的技術:
- FTP transfer
- Using 伺服器 management tools that provide replication on a remote site
- MSI installer application
XCOPY部署只是將應用程式文件複製到生產伺服器並在那裡設置一個虛擬目錄。您需要使用Internet信息管理器Microsoft管理控制台(MMC管理單元)設置虛擬目錄。
Copying a Website
「複製網站」選項在Visual Studio中可用。它可以從「網站」->「複製網站」菜單選項中獲得。此菜單項允許將當前網站複製到其他本地或遠程位置。它是一種集成的FTP工具。
使用此選項,連接到目標目標目標,選擇所需的複製模式:
- Overwrite
- Source to Target Files
- Sync UP Source And Target Projects
然後繼續物理複製文件。與XCOPY部署不同,此部署過程是在Visual Studio環境中完成的。但是,上述兩種部署方法都存在以下問題:
- You pass on your source code.
- There is no pre-compilation and related error checking for the files.
- The initial page load will be slow.
Creating a Setup Project
在這種方法中,您使用Windows安裝程序並打包您的web應用程式,以便它可以部署到生產伺服器上。Visual Studio允許您構建部署包。讓我們在一個現有的項目上測試一下,比如說數據綁定項目。
打開項目並執行以下步驟:
步驟(1):選擇「文件」->「添加」->「新建項目」,並在解決方案資源管理器中突出顯示網站根目錄。
步驟(2):在「其他項目類型」下選擇「設置和部署」。選擇安裝嚮導。
步驟(3):選擇默認位置可確保設置項目位於站點根目錄下其自己的文件夾中。單擊「確定」以獲得嚮導的第一個啓動螢幕。
步驟(4):選擇項目類型。選擇「爲web應用程式創建設置」。
步驟(5):接下來,第三個螢幕要求從解決方案中的所有項目中選擇項目輸出。選中「內容文件來自…」旁邊的複選框
步驟(6):第四個螢幕允許包含其他文件,如自述文件。但是,在我們的情況下,沒有這樣的文件。單擊「完成」。
步驟(7):最終螢幕顯示設置項目的設置摘要。
步驟(8):設置項目將添加到解決方案資源管理器中,並且主設計窗口顯示一個文件系統編輯器。
步驟(9):下一步是構建安裝項目。右鍵單擊解決方案資源管理器中的項目名稱,然後選擇「生成」。
步驟(10):生成完成後,您將在輸出窗口中收到以下消息:
生成過程將創建兩個文件:
- Setup.exe
- Setup-databinding.msi
您需要將這些文件複製到伺服器。雙擊安裝文件以在本地計算機上安裝.msi文件的內容。