- ASP.NET 教程
- ASP.NET - 首頁
- ASP.NET - 簡介
- ASP.NET - 環境
- ASP.NET - 生命週期
- ASP.NET - 第一個示例
- ASP.NET - 事件處理
- ASP.NET - 伺服器端
- ASP.NET - 伺服器控制元件
- ASP.NET - HTML 伺服器控制元件
- ASP.NET - 客戶端
- ASP.NET - 基本控制元件
- ASP.NET - 指令
- ASP.NET - 狀態管理
- ASP.NET - 驗證器
- ASP.NET - 資料庫訪問
- ASP.NET - ADO.net
- ASP.NET - 檔案上傳
- ASP.NET - 廣告輪播
- ASP.NET - 日曆控制元件
- ASP.NET - 多檢視
- ASP.NET - 面板控制元件
- ASP.NET - AJAX 控制元件
- ASP.NET - 資料來源
- ASP.NET - 資料繫結
- ASP.NET - 自定義控制元件
- ASP.NET - 個性化
- ASP.NET - 錯誤處理
- ASP.NET - 除錯
- ASP.NET - LINQ
- ASP.NET - 安全性
- ASP.NET - 資料快取
- ASP.NET - Web 服務
- ASP.NET - 多執行緒
- ASP.NET - 配置
- ASP.NET - 部署
- ASP.NET 資源
- ASP.NET - 快速指南
- ASP.NET - 有用資源
- ASP.NET - 討論
ASP.NET - 快速指南
ASP.NET - 簡介
什麼是 ASP.NET?
ASP.NET 是一個 Web 開發平臺,它提供程式設計模型、全面的軟體基礎結構以及構建健壯的 Web 應用程式(用於 PC 和移動裝置)所需的各種服務。
ASP.NET 構建在 HTTP 協議之上,並使用 HTTP 命令和策略來建立瀏覽器與伺服器之間的雙向通訊和協作。
ASP.NET 是 Microsoft .Net 平臺的一部分。ASP.NET 應用程式是編譯後的程式碼,使用 .Net 框架中存在的可擴充套件和可重用的元件或物件編寫。這些程式碼可以使用 .Net 框架中的整個類層次結構。
ASP.NET 應用程式程式碼可以用以下任何一種語言編寫:
- C#
- Visual Basic.Net
- Jscript
- J#
ASP.NET 用於透過網際網路生成互動式、資料驅動的 Web 應用程式。它包含大量控制元件,例如文字框、按鈕和標籤,用於組裝、配置和操作程式碼以建立 HTML 頁面。
ASP.NET Web 窗體模型
ASP.NET Web 窗體將互動的事件驅動模型擴充套件到 Web 應用程式。瀏覽器將 Web 窗體提交到 Web 伺服器,伺服器響應地返回完整的標記頁面或 HTML 頁面。
所有客戶端使用者活動都轉發到伺服器進行有狀態處理。伺服器處理客戶端操作的輸出並觸發相應的反應。
現在,HTTP 是一種無狀態協議。ASP.NET 框架有助於儲存有關應用程式狀態的資訊,其中包括:
- 頁面狀態
- 會話狀態
頁面狀態是客戶端的狀態,即 Web 窗體中各種輸入欄位的內容。會話狀態是從使用者訪問和使用過的各個頁面收集的資訊,即整個會話狀態。為了清楚概念,讓我們以購物車為例。
使用者將商品新增到購物車。商品是從一個頁面(例如商品頁面)中選擇的,並且收集的商品總數和價格顯示在另一個頁面(例如購物車頁面)上。僅使用 HTTP 無法跟蹤來自各個頁面的所有資訊。ASP.NET 會話狀態和伺服器端基礎結構在整個會話中全域性跟蹤收集的資訊。
ASP.NET 執行時在生成 ASP.NET 執行時程式碼時將頁面狀態在頁面請求之間來回傳輸到伺服器,並在隱藏欄位中合併伺服器端元件的狀態。
這樣,伺服器就能瞭解整個應用程式狀態,並以分層連線的方式執行。
ASP.NET 元件模型
ASP.NET 元件模型提供了 ASP.NET 頁面的各種構建塊。基本上它是一個物件模型,描述了:
幾乎所有 HTML 元素或標籤(例如 <form> 和 <input>)的伺服器端對應項。
伺服器控制元件,有助於開發複雜的使用者介面。例如,日曆控制元件或網格檢視控制元件。
ASP.NET 是一種在 .Net 框架上執行的技術,其中包含所有與 Web 相關的功能。.Net 框架由面向物件的層次結構組成。ASP.NET Web 應用程式由頁面組成。當用戶請求 ASP.NET 頁面時,IIS 將頁面的處理委託給 ASP.NET 執行時系統。
ASP.NET 執行時將 .aspx 頁面轉換為類的例項,該類繼承自 .Net 框架的基本類頁面。因此,每個 ASP.NET 頁面都是一個物件,其所有元件(即伺服器端控制元件)也是物件。
.Net Framework 3.5 的元件
在進入下一節 Visual Studio.Net 之前,讓我們先了解一下 .Net Framework 3.5 的各個元件。下表描述了 .Net Framework 3.5 的元件及其執行的任務
| 元件及其描述 |
|---|
|
(1) 公共語言執行時或 CLR 它執行記憶體管理、異常處理、除錯、安全檢查、執行緒執行、程式碼執行、程式碼安全、驗證和編譯。由 CLR 直接管理的程式碼稱為託管程式碼。當託管程式碼被編譯時,編譯器會將原始碼轉換為與 CPU 無關的中間語言 (IL) 程式碼。即時 (JIT) 編譯器將 IL 程式碼編譯成特定於 CPU 的本機程式碼。 |
|
(2) .Net Framework 類庫 它包含一個龐大的可重用型別庫。類、介面、結構和列舉值,統稱為型別。 |
|
(3) 公共語言規範 它包含 .Net 支援的語言規範和語言整合的實現。 |
|
(4) 公共型別系統 它提供在執行時宣告、使用和管理型別以及跨語言通訊的指南。 |
|
(5) 元資料和程式集 元資料是描述程式的二進位制資訊,儲存在可移植可執行檔案 (PE) 中或記憶體中。程式集是一個邏輯單元,由程式集清單、型別元資料、IL 程式碼以及一組資源(如影像檔案)組成。 |
|
(6) Windows 窗體 Windows 窗體包含應用程式中顯示的任何視窗的圖形表示。 |
|
(7) ASP.NET 和 ASP.NET AJAX ASP.NET 是 Web 開發模型,而 AJAX 是 ASP.NET 的擴充套件,用於開發和實現 AJAX 功能。ASP.NET AJAX 包含允許開發人員更新網站上的資料而無需完全重新載入頁面的元件。 |
|
(8) ADO.NET 它是用於處理資料和資料庫的技術。它提供對 SQL Server、OLE DB、XML 等資料來源的訪問。ADO.NET 允許連線到資料來源以檢索、操作和更新資料。 |
|
(9) Windows 工作流基礎 (WF) 它有助於在 Windows 中構建基於工作流的應用程式。它包含活動、工作流執行時、工作流設計器和規則引擎。 |
|
(10)Windows Presentation Foundation 它提供了使用者介面和業務邏輯之間的分離。它有助於使用文件、媒體、二維和三維圖形、動畫等開發視覺上令人驚歎的介面。 |
|
(11) Windows Communication Foundation (WCF) 它是用於構建和執行連線系統的技術。 |
|
(12) Windows CardSpace 它為訪問資源和在網際網路上共享個人資訊提供安全性。 |
|
(13) LINQ 它使用類似於傳統查詢語言 SQL 的語法,為 .Net 語言賦予資料查詢功能。 |
ASP.NET - 環境設定
ASP.NET 在 HTTP 之上提供了一個抽象層,Web 應用程式在此基礎上構建。它在面向物件正規化中提供高階實體,例如類和元件。
構建 ASP.NET 應用程式和前端的關鍵開發工具是 Visual Studio。在本教程中,我們將使用 Visual Studio 2008。
Visual Studio 是一個整合開發環境,用於編寫、編譯和除錯程式碼。它提供了一套完整的開發工具,用於構建 ASP.NET Web 應用程式、Web 服務、桌面應用程式和移動應用程式。
Visual Studio IDE
新的專案視窗允許從可用的模板中選擇應用程式模板。
當您啟動一個新的網站時,ASP.NET 會為該網站提供起始資料夾和檔案,包括該網站第一個 Web 窗體的兩個檔案。
名為 Default.aspx 的檔案包含定義窗體的 HTML 和 asp 程式碼,而名為 Default.aspx.cs(用於 C# 編碼)或名為 Default.aspx.vb(用於 VB 編碼)的檔案包含您選擇的語言中的程式碼,此程式碼負責窗體上執行的操作。
Visual Studio IDE 中的主視窗是 Web 窗體設計器視窗。其他支援視窗包括工具箱、解決方案資源管理器和屬性視窗。您可以使用設計器設計 Web 窗體,向窗體上的控制元件新增程式碼,以便窗體根據您的需要工作,您可以使用程式碼編輯器。
使用檢視和視窗
您可以透過以下方式使用視窗:
要將 Web 窗體設計器從一個檢視更改為另一個檢視,請單擊“設計”或“源”按鈕。
要關閉視窗,請單擊右上角的關閉按鈕,要重新顯示,請從“檢視”選單中選擇它。
要隱藏視窗,請單擊其“自動隱藏”按鈕。然後視窗將更改為選項卡。要再次顯示,請再次單擊“自動隱藏”按鈕。
要更改視窗的大小,只需拖動它即可。
向您的網站新增資料夾和檔案
建立新的 Web 窗體時,Visual Studio 會自動生成窗體的起始 HTML 並將其顯示在 Web 窗體設計器的源檢視中。解決方案資源管理器用於向網站新增任何其他檔案、資料夾或任何現有專案。
要新增標準資料夾,請右鍵單擊解決方案資源管理器中您將在其下新增資料夾的專案或資料夾,然後選擇“新建資料夾”。
要新增 ASP.NET 資料夾,請在解決方案資源管理器中右鍵單擊專案,然後從列表中選擇資料夾。
要將現有項新增到站點,請在解決方案資源管理器中右鍵單擊要新增該項的專案或資料夾,然後從對話方塊中進行選擇。
專案和解決方案
一個典型的 ASP.NET 應用程式包含許多項:Web 內容檔案(.aspx)、原始檔(.cs 檔案)、程式集(.dll 和 .exe 檔案)、資料來源檔案(.mdb 檔案)、引用、圖示、使用者控制元件以及其他各種檔案和資料夾。所有構成網站的這些檔案都包含在一個解決方案中。
建立新網站時,VB2008 會自動建立解決方案並在解決方案資源管理器中顯示它。
解決方案可以包含一個或多個專案。一個專案包含內容檔案、原始檔以及其他檔案,如資料來源和影像檔案。通常,專案的內容會被編譯成一個程式集,作為可執行檔案(.exe)或動態連結庫(.dll)檔案。
通常,一個專案包含以下內容檔案
- 頁面檔案(.aspx)
- 使用者控制元件(.ascx)
- Web 服務(.asmx)
- 母版頁(.master)
- 站點地圖(.sitemap)
- 網站配置檔案(.config)
構建和執行專案
您可以透過以下方式執行應用程式
- 選擇“啟動”
- 從“除錯”選單中選擇“不除錯啟動”
- 按 F5
- Ctrl-F5
程式被構建,這意味著透過從“生成”選單中選擇命令生成 .exe 或 .dll 檔案。
ASP.NET - 生命週期
ASP.NET 生命週期指定如何
- ASP.NET 處理頁面以生成動態輸出
- 應用程式及其頁面被例項化和處理
- ASP.NET 動態編譯頁面
ASP.NET 生命週期可以分為兩組
- 應用程式生命週期
- 頁面生命週期
ASP.NET 應用程式生命週期
應用程式生命週期包含以下階段
使用者請求訪問應用程式資源(頁面)。瀏覽器將此請求傳送到 Web 伺服器。
統一管道接收第一個請求,併發生以下事件
建立 ApplicationManager 類的物件。
建立 HostingEnvironment 類的物件以提供有關資源的資訊。
編譯應用程式中的頂級項。
建立響應物件。建立並初始化應用程式物件(如 HttpContext、HttpRequest 和 HttpResponse)。
建立 HttpApplication 物件的例項並將其分配給請求。
HttpApplication 類處理請求。此類引發不同的事件來處理請求。
ASP.NET 頁面生命週期
當請求頁面時,它會被載入到伺服器記憶體中、處理併發送到瀏覽器。然後,它會從記憶體中解除安裝。在每個步驟中,都提供了方法和事件,可以根據應用程式的需要進行覆蓋。換句話說,您可以編寫自己的程式碼來覆蓋預設程式碼。
Page 類建立頁面上所有控制元件的分層樹。頁面上的所有元件(指令除外)都是此控制元件樹的一部分。您可以透過將 trace="true" 新增到頁面指令中來檢視控制元件樹。我們將在“指令”和“事件處理”下介紹頁面指令和跟蹤。
頁面生命週期階段如下
- 初始化
- 例項化頁面上的控制元件
- 恢復和維護狀態
- 執行事件處理程式程式碼
- 頁面呈現
瞭解頁面週期有助於編寫程式碼,以便在頁面生命週期的任何階段執行某些特定操作。它還有助於編寫自定義控制元件並在正確的時間初始化它們,使用檢視狀態資料填充其屬性並執行控制元件行為程式碼。
以下是 ASP.NET 頁面的不同階段
頁面請求 - 當 ASP.NET 獲取頁面請求時,它會決定是解析和編譯頁面,還是使用頁面的快取版本;相應地傳送響應。
頁面生命週期開始 - 在此階段,設定 Request 和 Response 物件。如果請求是舊請求或回發,則將頁面的 IsPostBack 屬性設定為 true。還會設定頁面的 UICulture 屬性。
頁面初始化 - 在此階段,透過設定 UniqueID 屬性為頁面上的控制元件分配唯一 ID,並應用主題。對於新請求,載入回發資料並將控制元件屬性恢復為檢視狀態值。
頁面載入 - 在此階段,使用檢視狀態和控制元件狀態值設定控制元件屬性。
驗證 - 呼叫驗證控制元件的 Validate 方法,並在成功執行後,將頁面的 IsValid 屬性設定為 true。
回發事件處理 - 如果請求是回發(舊請求),則呼叫相關的事件處理程式。
頁面呈現 - 在此階段,儲存頁面和所有控制元件的檢視狀態。頁面為每個控制元件呼叫 Render 方法,呈現的輸出寫入頁面的 Response 屬性的 OutputStream 類。
解除安裝 - 將呈現的頁面傳送到客戶端,並解除安裝頁面屬性(如 Response 和 Request),並完成所有清理工作。
ASP.NET 頁面生命週期事件
在頁面生命週期的每個階段,頁面都會引發一些可以編碼的事件。事件處理程式基本上是一個函式或子例程,使用宣告性屬性(如 Onclick 或 handle)繫結到事件。
以下是頁面生命週期事件
PreInit - PreInit 是頁面生命週期中的第一個事件。它檢查 IsPostBack 屬性並確定頁面是否為回發。它設定主題和母版頁,建立動態控制元件,以及獲取和設定配置檔案屬性值。可以透過過載 OnPreInit 方法或建立 Page_PreInit 處理程式來處理此事件。
Init - Init 事件初始化控制元件屬性,並構建控制元件樹。可以透過過載 OnInit 方法或建立 Page_Init 處理程式來處理此事件。
InitComplete - InitComplete 事件允許跟蹤檢視狀態。所有控制元件都開啟檢視狀態跟蹤。
LoadViewState - LoadViewState 事件允許將檢視狀態資訊載入到控制元件中。
LoadPostData - 在此階段,處理使用 <form> 標記定義的所有輸入欄位的內容。
PreLoad - PreLoad 發生在回發資料載入到控制元件之前。可以透過過載 OnPreLoad 方法或建立 Page_PreLoad 處理程式來處理此事件。
Load - 首先為頁面引發 Load 事件,然後遞迴地為所有子控制元件引發。建立控制元件樹中的控制元件。可以透過過載 OnLoad 方法或建立 Page_Load 處理程式來處理此事件。
LoadComplete - 載入過程完成,執行控制元件事件處理程式,並進行頁面驗證。可以透過過載 OnLoadComplete 方法或建立 Page_LoadComplete 處理程式來處理此事件
PreRender - PreRender 事件發生在輸出呈現之前。透過處理此事件,頁面和控制元件可以在輸出呈現之前執行任何更新。
PreRenderComplete - 由於 PreRender 事件會遞迴地為所有子控制元件觸發,因此此事件可確保預呈現階段完成。
SaveStateComplete - 儲存頁面上控制元件的狀態。儲存個性化、控制元件狀態和檢視狀態資訊。生成 HTML 標記。可以透過覆蓋 Render 方法或建立 Page_Render 處理程式來處理此階段。
UnLoad - UnLoad 階段是頁面生命週期的最後一個階段。它遞迴地為所有控制元件引發 UnLoad 事件,最後為頁面本身引發。完成最終清理工作,並釋放所有資源和引用(如資料庫連線)。可以透過修改 OnUnLoad 方法或建立 Page_UnLoad 處理程式來處理此事件。
ASP.NET - 第一個示例
ASP.NET 頁面由許多伺服器控制元件以及 HTML 控制元件、文字和影像組成。來自頁面和頁面上不同控制元件狀態的敏感資料儲存在構成該頁面請求上下文的隱藏欄位中。
ASP.NET 執行時控制頁面例項與其狀態之間的關聯。ASP.NET 頁面是 Page 物件或從其繼承的物件。
頁面上的所有控制元件也是從父 Control 類繼承的相關控制元件類的物件。執行頁面時,會建立頁面物件的例項以及其所有內容控制元件。
ASP.NET 頁面也是一個使用 .aspx 副檔名儲存的伺服器端檔案。它具有模組化特性,可以分為以下核心部分
- 頁面指令
- 程式碼部分
- 頁面佈局
頁面指令
頁面指令設定頁面執行的環境。@Page 指令定義 ASP.NET 頁面解析器和編譯器使用的頁面特定屬性。頁面指令指定如何處理頁面,以及需要對頁面做出哪些假設。
它允許匯入名稱空間、載入程式集以及使用自定義標記名稱和名稱空間字首註冊新控制元件。
程式碼部分
程式碼部分為頁面和控制元件事件提供處理程式以及其他所需的函式。我們提到過,ASP.NET 遵循物件模型。現在,當用戶介面上發生某些事件時,例如使用者單擊按鈕或移動游標,這些物件會引發事件。這些事件需要響應的響應型別在事件處理程式函式中進行編碼。事件處理程式只不過是繫結到控制元件的函式。
程式碼部分或程式碼隱藏檔案提供了所有這些事件處理程式例程以及開發人員使用的其他函式。頁面程式碼可以預編譯並以二進位制程式集的形式部署。
頁面佈局
頁面佈局提供頁面的介面。它包含伺服器控制元件、文字、內聯 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..." OnServerClick="convertoupper"/>
<hr />
<h3> Results: </h3>
<span runat="server" id="changed_text" />
</form>
</body>
</html>
將此檔案複製到 Web 伺服器根目錄。通常是 c:\iNETput\wwwroot。從瀏覽器開啟檔案以執行它,它會生成以下結果
使用 Visual Studio IDE
讓我們使用 Visual Studio IDE 開發相同的示例。無需鍵入程式碼,只需將控制元件拖放到設計檢視中即可
內容檔案會自動開發。您只需新增 Button1_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 - 事件處理
什麼是事件?
事件是操作或事件,例如滑鼠單擊、按鍵、滑鼠移動或任何系統生成的通知。程序透過事件進行通訊。例如,中斷是系統生成的事件。當事件發生時,應用程式應該能夠對其做出響應並進行管理。
ASP.NET 中的事件是在客戶端機器上觸發,並在伺服器機器上處理的。例如,使用者點選瀏覽器中顯示的一個按鈕。就會觸發一個 Click 事件。瀏覽器透過將其釋出到伺服器來處理此客戶端事件。
伺服器有一個子例程描述在事件觸發時該做什麼;它被稱為事件處理程式。因此,當事件訊息傳輸到伺服器時,它會檢查 Click 事件是否具有關聯的事件處理程式。如果有,則執行事件處理程式。
事件引數
ASP.NET 事件處理程式通常接受兩個引數並返回 void。第一個引數表示觸發事件的物件,第二個引數是事件引數。
事件的一般語法為
private void EventName (object sender, EventArgs e);
應用程式和會話事件
最重要的應用程式事件是
Application_Start - 當應用程式/網站啟動時觸發。
Application_End - 當應用程式/網站停止時觸發。
類似地,最常用的會話事件是
Session_Start - 當用戶第一次請求應用程式中的頁面時觸發。
Session_End - 當會話結束時觸發。
頁面和控制元件事件
常見的頁面和控制元件事件是
DataBinding - 當控制元件繫結到資料來源時觸發。
Disposed - 當頁面或控制元件被釋放時觸發。
Error - 是一個頁面事件,當丟擲未處理的異常時發生。
Init - 當頁面或控制元件初始化時觸發。
Load - 當頁面或控制元件載入時觸發。
PreRender - 當頁面或控制元件即將呈現時觸發。
Unload - 當頁面或控制元件從記憶體中解除安裝時觸發。
使用控制元件處理事件
所有 ASP.NET 控制元件都作為類實現,並且它們具有在使用者對它們執行某些操作時觸發的事件。例如,當用戶點選按鈕時,會生成“Click”事件。為了處理事件,有內建的屬性和事件處理程式。事件處理程式被編碼以響應事件,並對其採取適當的操作。
預設情況下,Visual Studio 透過在 Sub 過程上包含 Handles 子句來建立事件處理程式。此子句命名過程處理的控制元件和事件。
按鈕控制元件的 ASP 標記
<asp:Button ID="btnCancel" runat="server" Text="Cancel" />
Click 事件的事件處理程式
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" />
Click 事件的事件處理程式
Protected Sub btnCancel_Click(ByVal sender As Object, ByVal e As System.EventArgs) End Sub
常見的控制元件事件是
| 事件 | 屬性 | 控制元件 |
|---|---|---|
| Click | OnClick | 按鈕、影像按鈕、連結按鈕、影像對映 |
| Command | OnCommand | 按鈕、影像按鈕、連結按鈕 |
| TextChanged | OnTextChanged | 文字框 |
| SelectedIndexChanged | OnSelectedIndexChanged | 下拉列表、列表框、單選按鈕列表、複選框列表。 |
| CheckedChanged | OnCheckedChanged | 複選框、單選按鈕 |
某些事件會導致表單立即回發到伺服器,這些事件稱為回發事件。例如,單擊事件,如 Button.Click。
某些事件不會立即回發到伺服器,這些事件稱為非回發事件。
例如,更改事件或選擇事件,如 TextBox.TextChanged 或 CheckBox.CheckedChanged。可以透過將它們的 AutoPostBack 屬性設定為 true 使非回發事件立即回發。
預設事件
Page 物件的預設事件是 Load 事件。類似地,每個控制元件都有一個預設事件。例如,按鈕控制元件的預設事件是 Click 事件。
可以在 Visual Studio 中建立預設事件處理程式,只需雙擊設計檢視中的控制元件即可。下表顯示了一些常見控制元件的預設事件
| 控制元件 | 預設事件 |
|---|---|
| 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 |
示例
此示例包含一個簡單的頁面,頁面上有一個標籤控制元件和一個按鈕控制元件。當頁面事件(如 Page_Load、Page_Init、Page_PreRender 等)發生時,它會發送一條訊息,該訊息由標籤控制元件顯示。當點選按鈕時,會觸發 Button_Click 事件,該事件也會發送一條訊息以在標籤上顯示。
建立一個新的網站,並從控制元件工具箱中拖動一個標籤控制元件和一個按鈕控制元件到它上面。使用屬性視窗,將控制元件的 ID 分別設定為 .lblmessage. 和 .btnclick.。將按鈕控制元件的 Text 屬性設定為“Click”。
標記檔案(.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>
雙擊設計檢視以移動到程式碼隱藏檔案。Page_Load 事件會自動建立,其中沒有任何程式碼。寫下以下不言自明的程式碼行
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 - 伺服器端
我們已經學習了頁面生命週期以及頁面如何包含各種控制元件。頁面本身被例項化為一個控制元件物件。所有 Web 窗體基本上都是 ASP.NET Page 類的例項。頁面類具有以下非常有用的屬性,這些屬性對應於內在物件
- Session
- Application
- Cache
- Request
- Response
- Server
- User
- Trace
我們將在適當的時候討論每個物件。在本教程中,我們將探討 Server 物件、Request 物件和 Response 物件。
Server 物件
Asp.NET 中的 Server 物件是 System.Web.HttpServerUtility 類的例項。HttpServerUtility 類提供了許多屬性和方法來執行各種任務。
Server 物件的屬性和方法
HttpServerUtility 類的方法和屬性透過 ASP.NET 提供的內在 Server 物件公開。
下表提供了屬性列表
| 屬性 | 描述 |
|---|---|
| MachineName | 伺服器計算機的名稱 |
| ScriptTimeOut | 獲取和設定請求超時值(以秒為單位)。 |
下表提供了部分重要方法的列表
| 方法 | 描述 |
|---|---|
| CreateObject(String) | 建立由其 ProgID(程式 ID)標識的 COM 物件的例項。 |
| CreateObject(Type) | 建立由其 Type 標識的 COM 物件的例項。 |
| Equals(Object) | 確定指定的 Object 是否等於當前 Object。 |
| Execute(String) | 在當前請求的上下文中執行指定虛擬路徑的處理程式。 |
| Execute(String, Boolean) | 在當前請求的上下文中執行指定虛擬路徑的處理程式,並指定是否清除 QueryString 和 Form 集合。 |
| GetLastError | 返回之前的異常。 |
| GetType | 獲取當前例項的 Type。 |
| HtmlEncode | 將普通字串更改為包含合法 HTML 字元的字串。 |
| HtmlDecode | 將 Html 字串轉換為普通字串。 |
| ToString | 返回表示當前 Object 的 String。 |
| Transfer(String) | 對於當前請求,終止當前頁面的執行並使用頁面的指定 URL 路徑開始新頁面的執行。 |
| UrlDecode | 將 URL 字串轉換為普通字串。 |
| UrlEncodeToken | 與 UrlEncode 的作用相同,但作用於包含 Base64 編碼資料的位元組陣列。 |
| UrlDecodeToken | 與 UrlDecode 的作用相同,但作用於包含 Base64 編碼資料的位元組陣列。 |
| MapPath | 返回對應於伺服器上指定虛擬檔案路徑的物理路徑。 |
| Transfer | 將執行轉移到當前應用程式中的另一個網頁。 |
Request 物件
Request 物件是 System.Web.HttpRequest 類的例項。它表示使頁面載入到瀏覽器中的 HTTP 請求的值和屬性。
此物件提供的資訊由更高級別的抽象(Web 控制元件模型)包裝。但是,此物件有助於檢查某些資訊,例如客戶端瀏覽器和 Cookie。
Request 物件的屬性和方法
下表提供了 Request 物件的一些值得注意的屬性
| 屬性 | 描述 |
|---|---|
| AcceptTypes | 獲取客戶端支援的 MIME 接受型別的字串陣列。 |
| ApplicationPath | 獲取伺服器上 ASP.NET 應用程式的虛擬應用程式根路徑。 |
| Browser | 獲取或設定有關請求客戶端的瀏覽器功能的資訊。 |
| ContentEncoding | 獲取或設定實體正文的字元集。 |
| ContentLength | 指定客戶端傳送的內容的長度(以位元組為單位)。 |
| ContentType | 獲取或設定傳入請求的 MIME 內容型別。 |
| Cookies | 獲取客戶端傳送的 Cookie 集合。 |
| FilePath | 獲取當前請求的虛擬路徑。 |
| Files | 獲取客戶端以多部分 MIME 格式上傳的檔案的集合。 |
| Form | 獲取表單變數的集合。 |
| Headers | 獲取 HTTP 標頭的集合。 |
| HttpMethod | 獲取客戶端使用的 HTTP 資料傳輸方法(例如 GET、POST 或 HEAD)。 |
| InputStream | 獲取傳入 HTTP 實體正文的內容。 |
| IsSecureConnection | 獲取一個值,該值指示 HTTP 連線是否使用安全套接字(即 HTTPS)。 |
| QueryString | 獲取 HTTP 查詢字串變數的集合。 |
| RawUrl | 獲取當前請求的原始 URL。 |
| RequestType | 獲取或設定客戶端使用的 HTTP 資料傳輸方法(GET 或 POST)。 |
| ServerVariables | 獲取 Web 伺服器變數的集合。 |
| TotalBytes | 獲取當前輸入流中的位元組數。 |
| Url | 獲取有關當前請求的 URL 的資訊。 |
| UrlReferrer | 獲取有關客戶端先前請求的 URL 的資訊,該請求連結到當前 URL。 |
| UserAgent | 獲取客戶端瀏覽器的原始使用者代理字串。 |
| UserHostAddress | 獲取遠端客戶端的 IP 主機地址。 |
| UserHostName | 獲取遠端客戶端的 DNS 名稱。 |
| UserLanguages | 獲取客戶端語言首選項的已排序字串陣列。 |
下表提供了部分重要方法的列表
| 方法 | 描述 |
|---|---|
| BinaryRead | 從當前輸入流中以二進位制方式讀取指定數量的位元組。 |
| Equals(Object) | 確定指定的物件是否等於當前物件。(繼承自object。) |
| GetType | 獲取當前例項的 Type。 |
| MapImageCoordinates | 將傳入的影像欄位表單引數對映到相應的x座標和y座標值。 |
| MapPath(String) | 將指定的虛擬路徑對映到物理路徑。 |
| SaveAs | 將HTTP請求儲存到磁碟。 |
| ToString | 返回表示當前物件的字串。 |
| ValidateInput | 導致對透過Cookies、Form和QueryString屬性訪問的集合進行驗證。 |
Response物件
Response物件表示伺服器對客戶端請求的響應。它是System.Web.HttpResponse類的例項。
在ASP.NET中,response物件在將HTML文字傳送到客戶端方面沒有發揮任何重要作用,因為伺服器端控制元件具有巢狀的面向物件的渲染方法。
但是,HttpResponse物件仍然提供了一些重要的功能,例如cookie功能和Redirect()方法。Response.Redirect()方法允許將使用者轉移到另一個頁面,包括應用程式內部和外部。它需要一個往返。
Response物件的屬性和方法
下表提供了一些值得注意的Response物件屬性
| 屬性 | 描述 |
|---|---|
| Buffer | 獲取或設定一個值,該值指示是否緩衝輸出並在完成響應處理後傳送。 |
| BufferOutput | 獲取或設定一個值,該值指示是否緩衝輸出並在完成頁面處理後傳送。 |
| Charset | 獲取或設定輸出流的HTTP字元集。 |
| ContentEncoding | 獲取或設定輸出流的HTTP字元集。 |
| ContentType | 獲取或設定輸出流的HTTP MIME型別。 |
| Cookies | 獲取響應cookie集合。 |
| Expires | 獲取或設定瀏覽器快取的頁面過期前多少分鐘。 |
| ExpiresAbsolute | 獲取或設定刪除快取中快取資訊的絕對日期和時間。 |
| HeaderEncoding | 獲取或設定一個表示當前標頭輸出流編碼的編碼物件。 |
| Headers | 獲取響應標頭的集合。 |
| IsClientConnected | 獲取一個值,該值指示客戶端是否仍然連線到伺服器。 |
| Output | 啟用將文字輸出到傳出的HTTP響應流。 |
| OutputStream | 啟用將二進位制輸出到傳出的HTTP內容主體。 |
| RedirectLocation | 獲取或設定Http Location標頭的值。 |
| Status | 設定返回給客戶端的狀態行。 |
| StatusCode | 獲取或設定返回給客戶端的輸出的HTTP狀態程式碼。 |
| StatusDescription | 獲取或設定返回給客戶端的輸出的HTTP狀態字串。 |
| SubStatusCode | 獲取或設定限定響應狀態程式碼的值。 |
| SuppressContent | 獲取或設定一個值,該值指示是否將HTTP內容傳送到客戶端。 |
下表提供了部分重要方法的列表
| 方法 | 描述 |
|---|---|
| AddHeader | 將HTTP標頭新增到輸出流。AddHeader是為了與早期版本的ASP相容而提供的。 |
| AppendCookie | 基礎結構將HTTP cookie新增到內部cookie集合。 |
| AppendHeader | 將HTTP標頭新增到輸出流。 |
| AppendToLog | 將自定義日誌資訊新增到InterNET資訊服務 (IIS) 日誌檔案中。 |
| BinaryWrite | 將一系列二進位制字元寫入HTTP輸出流。 |
| ClearContent | 清除緩衝流中的所有內容輸出。 |
| Close | 關閉與客戶端的套接字連線。 |
| End | 將所有當前緩衝的輸出傳送到客戶端,停止頁面的執行,並引發EndRequest事件。 |
| Equals(Object) | 確定指定的物件是否等於當前物件。 |
| Flush | 將所有當前緩衝的輸出傳送到客戶端。 |
| GetType | 獲取當前例項的 Type。 |
| Pics | 將HTTP PICS-Label標頭附加到輸出流。 |
| Redirect(String) | 將請求重定向到新的URL並指定新的URL。 |
| Redirect(String, Boolean) | 將客戶端重定向到新的URL。指定新的URL以及是否應終止當前頁面的執行。 |
| SetCookie | 更新cookie集合中現有的cookie。 |
| ToString | 返回表示當前 Object 的 String。 |
| TransmitFile(String) | 將指定的檔案直接寫入HTTP響應輸出流,而無需將其快取在記憶體中。 |
| Write(Char) | 將字元寫入HTTP響應輸出流。 |
| Write(Object) | 將物件寫入HTTP響應流。 |
| Write(String) | 將字串寫入HTTP響應輸出流。 |
| WriteFile(String) | 將指定檔案的內容作為檔案塊直接寫入HTTP響應輸出流。 |
| WriteFile(String, Boolean) | 將指定檔案的內容作為記憶體塊直接寫入HTTP響應輸出流。 |
示例
以下簡單示例包含一個文字框控制元件,使用者可以在其中輸入名稱,一個按鈕將資訊傳送到伺服器,以及一個標籤控制元件以顯示客戶端計算機的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>
Button1_Click後面的程式碼
protected void Button1_Click(object sender, EventArgs e)
{
if (!String.IsNullOrEmpty(TextBox1.Text))
{
// Access the HttpServerUtility methods through
// the intrinsic Server object.
Label1.Text = "Welcome, " + Server.HtmlEncode(TextBox1.Text) +
".<br/> The url is " + Server.UrlEncode(Request.Url.ToString())
}
}
執行頁面以檢視以下結果
ASP.NET - 伺服器控制元件
控制元件是圖形使用者介面的小型構建塊,包括文字框、按鈕、複選框、列表框、標籤和許多其他工具。使用這些工具,使用者可以輸入資料、進行選擇並指示他們的偏好。
控制元件也用於結構性工作,例如驗證、資料訪問、安全性、建立母版頁和資料操作。
ASP.NET使用五種型別的Web控制元件,它們是
- HTML控制元件
- HTML伺服器控制元件
- ASP.NET伺服器控制元件
- ASP.NET Ajax伺服器控制元件
- 使用者控制元件和自定義控制元件
ASP.NET伺服器控制元件是ASP.NET中使用的主要控制元件。這些控制元件可以分為以下類別
驗證控制元件 - 這些用於驗證使用者輸入,它們透過執行客戶端指令碼工作。
資料來源控制元件 - 這些控制元件提供與不同資料來源的資料繫結。
資料檢視控制元件 - 這些是各種列表和表格,可以繫結到資料來源中的資料以進行顯示。
個性化控制元件 - 這些用於根據使用者偏好個性化頁面,基於使用者資訊。
登入和安全控制元件 - 這些控制元件提供使用者身份驗證。
母版頁 - 這些控制元件在整個應用程式中提供一致的佈局和介面。
導航控制元件 - 這些控制元件有助於導航。例如,選單、樹檢視等。
豐富控制元件 - 這些控制元件實現特殊功能。例如,AdRotator、FileUpload和Calendar控制元件。
使用伺服器控制元件的語法為
<asp:controlType ID ="ControlID" runat="server" Property1=value1 [Property2=value2] />
此外,Visual Studio具有以下功能,有助於生成無錯誤的程式碼
- 在設計檢視中拖放控制元件
- IntelliSense功能,顯示並自動完成屬性
- 屬性視窗,直接設定屬性值
伺服器控制元件的屬性
具有視覺外觀的ASP.NET伺服器控制元件派生自WebControl類,並繼承該類的所有屬性、事件和方法。
WebControl類本身以及一些未進行視覺呈現的其他伺服器控制元件派生自System.Web.UI.Control類。例如,PlaceHolder控制元件或XML控制元件。
ASP.Net伺服器控制元件繼承WebControl和System.Web.UI.Control類的所有屬性、事件和方法。
下表顯示了所有伺服器控制元件共有的繼承屬性
| 屬性 | 描述 |
|---|---|
| AccessKey | 按此鍵並按Alt鍵會將焦點移動到控制元件。 |
| Attributes | 它是任意屬性的集合(僅用於渲染),這些屬性與控制元件上的屬性不對應。 |
| BackColor | 背景顏色。 |
| BindingContainer | 包含此控制元件資料繫結的控制元件。 |
| BorderColor | 邊框顏色。 |
| BorderStyle | 邊框樣式。 |
| BorderWidth | 邊框寬度。 |
| CausesValidation | 指示它是否導致驗證。 |
| ChildControlCreated | 它指示伺服器控制元件的子控制元件是否已建立。 |
| ClientID | HTML標記的控制元件ID。 |
| Context | 與伺服器控制元件關聯的HttpContext物件。 |
| 控制元件 | 控制元件中包含的所有控制元件的集合。 |
| ControlStyle | Web伺服器控制元件的樣式。 |
| CssClass | CSS類 |
| DataItemContainer | 如果命名容器實現IDataItemContainer,則獲取對命名容器的引用。 |
| DataKeysContainer | 如果命名容器實現IDataKeysControl,則獲取對命名容器的引用。 |
| DesignMode | 它指示控制元件是否正在設計圖面上使用。 |
| DisabledCssClass | 獲取或設定在控制元件停用時應用於渲染的HTML元素的CSS類。 |
| Enabled | 指示控制元件是否呈灰色。 |
| EnableTheming | 指示主題是否應用於控制元件。 |
| EnableViewState | 指示控制元件的檢視狀態是否得到維護。 |
| Events | 獲取控制元件的事件處理程式委託列表。 |
| Font | 字型。 |
| Forecolor | 前景色。 |
| HasAttributes | 指示控制元件是否設定了屬性。 |
| HasChildViewState | 指示當前伺服器控制元件的子控制元件是否具有任何儲存的檢視狀態設定。 |
| Height | 以畫素或%為單位的高度。 |
| ID | 控制元件的識別符號。 |
| IsChildControlStateCleared | 指示此控制元件中包含的控制元件是否具有控制元件狀態。 |
| IsEnabled | 獲取一個值,該值指示控制元件是否已啟用。 |
| IsTrackingViewState | 它指示伺服器控制元件是否正在儲存對其檢視狀態的更改。 |
| IsViewStateEnabled | 它指示此控制元件是否啟用了檢視狀態。 |
| LoadViewStateById | 它指示控制元件是否透過ID而不是索引參與載入其檢視狀態。 |
| Page | 包含控制元件的頁面。 |
| Parent | 父控制元件。 |
| RenderingCompatibility | 它指定渲染的HTML將與之相容的ASP.NET版本。 |
| Site | 在設計圖面上呈現時承載當前控制元件的容器。 |
| SkinID | 獲取或設定要應用於控制元件的皮膚。 |
| 樣式 | 獲取將在 Web 伺服器控制元件的外部標記上呈現為樣式屬性的文字屬性集合。 |
| TabIndex | 獲取或設定 Web 伺服器控制元件的 Tab 索引。 |
| TagKey | 獲取與此 Web 伺服器控制元件對應的 HtmlTextWriterTag 值。 |
| TagName | 獲取控制元件標記的名稱。 |
| TemplateControl | 包含此控制元件的模板。 |
| TemplateSourceDirectory | 獲取包含此控制元件的頁面或控制元件的虛擬目錄。 |
| ToolTip | 獲取或設定滑鼠指標懸停在 Web 伺服器控制元件上時顯示的文字。 |
| UniqueID | 唯一識別符號。 |
| ViewState | 獲取一個狀態資訊字典,該字典在對同一頁面的多個請求中儲存和還原伺服器控制元件的檢視狀態。 |
| ViewStateIgnoreCase | 它指示 StateBag 物件是否不區分大小寫。 |
| ViewStateMode | 獲取或設定此控制元件的檢視狀態模式。 |
| Visible | 它指示伺服器控制元件是否可見。 |
| Width | 獲取或設定 Web 伺服器控制元件的寬度。 |
伺服器控制元件的方法
下表提供了伺服器控制元件的方法
| 方法 | 描述 |
|---|---|
| AddAttributesToRender | 新增需要呈現到指定 HtmlTextWriterTag 的 HTML 屬性和樣式。 |
| AddedControl | 在將子控制元件新增到控制元件物件的 Controls 集合後呼叫。 |
| AddParsedSubObject | 通知伺服器控制元件已解析元素(XML 或 HTML),並將元素新增到伺服器控制元件的控制元件集合。 |
| ApplyStyleSheetSkin | 將頁面樣式表中定義的樣式屬性應用於控制元件。 |
| ClearCachedClientID | 基礎結構。將快取的 ClientID 值設定為 null。 |
| ClearChildControlState | 刪除伺服器控制元件的子控制元件的控制元件狀態資訊。 |
| ClearChildState | 刪除所有伺服器控制元件的子控制元件的檢視狀態和控制元件狀態資訊。 |
| ClearChildViewState | 刪除所有伺服器控制元件的子控制元件的檢視狀態資訊。 |
| CreateChildControls | 用於建立子控制元件。 |
| CreateControlCollection | 建立一個新的 ControlCollection 物件來儲存子控制元件。 |
| CreateControlStyle | 建立用於實現所有樣式相關屬性的樣式物件。 |
| DataBind | 將資料來源繫結到伺服器控制元件及其所有子控制元件。 |
| DataBind(Boolean) | 將資料來源繫結到伺服器控制元件及其所有子控制元件,並可以選擇引發 DataBinding 事件。 |
| DataBindChildren | 將資料來源繫結到伺服器控制元件的子控制元件。 |
| Dispose | 使伺服器控制元件能夠在從記憶體中釋放之前執行最終清理。 |
| EnsureChildControls | 確定伺服器控制元件是否包含子控制元件。如果未包含,則建立子控制元件。 |
| EnsureID | 為沒有識別符號的控制元件建立識別符號。 |
| Equals(Object) | 確定指定的物件是否等於當前物件。 |
| Finalize | 允許物件在被垃圾回收之前嘗試釋放資源並執行其他清理操作。 |
| FindControl(String) | 在當前命名容器中搜索具有指定 id 引數的伺服器控制元件。 |
| FindControl(String, Int32) | 在當前命名容器中搜索具有指定 id 和整數的伺服器控制元件。 |
| Focus | 將輸入焦點設定為控制元件。 |
| GetDesignModeState | 獲取控制元件的設計時資料。 |
| GetType | 獲取當前例項的型別。 |
| GetUniqueIDRelativeTo | 返回指定控制元件的 UniqueID 屬性的字首部分。 |
| HasControls | 確定伺服器控制元件是否包含任何子控制元件。 |
| HasEvents | 指示控制元件或任何子控制元件是否已註冊事件。 |
| IsLiteralContent | 確定伺服器控制元件是否僅儲存文字內容。 |
| LoadControlState | 恢復控制元件狀態資訊。 |
| LoadViewState | 恢復檢視狀態資訊。 |
| MapPathSecure | 檢索虛擬路徑(絕對或相對)對映到的物理路徑。 |
| MemberwiseClone | 建立當前物件的淺表副本。 |
| MergeStyle | 將指定樣式的任何非空白元素複製到 Web 控制元件,但不覆蓋控制元件的任何現有樣式元素。 |
| OnBubbleEvent | 確定伺服器控制元件的事件是否向上傳遞到頁面的 UI 伺服器控制元件層次結構。 |
| OnDataBinding | 引發資料繫結事件。 |
| OnInit | 引發 Init 事件。 |
| OnLoad | 引發 Load 事件。 |
| OnPreRender | 引發 PreRender 事件。 |
| OnUnload | 引發 Unload 事件。 |
| OpenFile | 獲取用於讀取檔案的 Stream。 |
| RemovedControl | 在將子控制元件從控制元件物件的 Controls 集合中刪除後呼叫。 |
| Render | 將控制元件呈現到指定的 HTML 編寫器。 |
| RenderBeginTag | 將控制元件的 HTML 開啟標記呈現到指定的編寫器。 |
| RenderChildren | 將伺服器控制元件子級的內容輸出到提供的 HtmlTextWriter 物件,該物件寫入要在客戶端呈現的內容。 |
| RenderContents | 將控制元件的內容呈現到指定的編寫器。 |
| RenderControl(HtmlTextWriter) | 將伺服器控制元件內容輸出到提供的 HtmlTextWriter 物件,並在啟用跟蹤的情況下儲存有關控制元件的跟蹤資訊。 |
| RenderEndTag | 將控制元件的 HTML 關閉標記呈現到指定的編寫器。 |
| ResolveAdapter | 獲取負責呈現指定控制元件的控制元件介面卡。 |
| SaveControlState | 儲存自頁面回發到伺服器以來發生的任何伺服器控制元件狀態更改。 |
| SaveViewState | 儲存 TrackViewState 方法呼叫後修改的任何狀態。 |
| SetDesignModeState | 設定控制元件的設計時資料。 |
| ToString | 返回表示當前物件的字串。 |
| TrackViewState | 導致控制元件跟蹤對其檢視狀態的更改,以便可以將其儲存在物件的檢視狀態屬性中。 |
示例
讓我們看一下特定的伺服器控制元件 - 樹檢視控制元件。樹檢視控制元件屬於導航控制元件。其他導航控制元件包括:選單控制元件和站點地圖路徑控制元件。
在頁面上新增樹檢視控制元件。從任務中選擇“編輯節點...” 。使用樹檢視節點編輯器編輯每個節點,如下所示
建立節點後,它在設計檢視中的顯示如下
“自動格式...” 任務允許您格式化樹檢視,如下所示
在頁面上新增標籤控制元件和文字框控制元件,並分別將其命名為 lblmessage 和 txtmessage。
編寫幾行程式碼以確保在選擇特定節點時,標籤控制元件顯示節點文字,而文字框顯示其下所有子節點(如果有)。該檔案後面的程式碼應如下所示
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">
使用 HTML 伺服器控制元件的優勢
儘管 ASP.NET 伺服器控制元件可以執行 HTML 伺服器控制元件完成的每一項工作,但在以下情況下,後者控制元件很有用
- 使用靜態表進行佈局。
- 將 HTML 頁面轉換為在 ASP.NET 下執行
下表描述了 HTML 伺服器控制元件
| 控制元件名稱 | HTML 標記 |
|---|---|
| HtmlHead | <head>元素 |
| 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> 元素 |
| HtmlLink | <link> 元素 |
| HtmlAnchor | <a> 元素 |
| HtmlButton | <button> 元素 |
| HtmlButton | <button> 元素 |
| HtmlForm | <form> 元素 |
| HtmlTable | <table> 元素 |
| HtmlTableCell | <td> 和 <th> |
| HtmlTableRow | <tr> 元素 |
| HtmlTitle | <title> 元素 |
| HtmlSelect | <select&t; 元素 |
| HtmlGenericControl | 所有未列出的 HTML 控制元件 |
示例
以下示例使用基本 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 - 客戶端
ASP.NET 客戶端程式碼有兩個方面
客戶端指令碼:它執行在瀏覽器上,從而加速頁面執行。例如,客戶端資料驗證可以捕獲無效資料並相應地警告使用者,而無需往返伺服器。
客戶端原始碼:ASP.NET 頁面生成此程式碼。例如,ASP.NET 頁面的 HTML 原始碼包含許多隱藏欄位和自動注入的 JavaScript 程式碼塊,這些程式碼塊保留檢視狀態等資訊或執行其他任務以使頁面正常工作。
客戶端指令碼
所有 ASP.NET 伺服器控制元件都允許呼叫使用 JavaScript 或 VBScript 編寫的客戶端程式碼。一些 ASP.NET 伺服器控制元件使用客戶端指令碼在不回發到伺服器的情況下向使用者提供響應。例如,驗證控制元件。
除了這些指令碼外,Button 控制元件還有一個屬性 OnClientClick,它允許在單擊按鈕時執行客戶端指令碼。
傳統和伺服器 HTML 控制元件具有以下事件,這些事件可以在觸發時執行指令碼
| 事件 | 描述 |
|---|---|
| onblur | 當控制元件失去焦點時 |
| onfocus | 當控制元件獲得焦點時 |
| onclick | 當控制元件被單擊時 |
| onchange | 當控制元件的值發生變化時 |
| onkeydown | 當用戶按下按鍵時 |
| onkeypress | 當用戶按下字母數字鍵時 |
| onkeyup | 當用戶釋放按鍵時 |
| onmouseover | 當用戶將滑鼠指標移到控制元件上時 |
| onserverclick | 當控制元件被單擊時,它會引發控制元件的 ServerClick 事件 |
客戶端原始碼
我們已經討論過,ASP.NET 頁面通常用兩個檔案編寫
- 內容檔案或標記檔案(.aspx)
- 程式碼隱藏檔案
內容檔案包含 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 - 基本控制元件
在本章中,我們將討論 ASP.NET 中提供的基本控制元件。
按鈕控制元件
ASP.NET 提供三種類型的按鈕控制元件
Button:它在矩形區域內顯示文字。
Link Button:它顯示看起來像超連結的文字。
Image Button:它顯示影像。
當用戶單擊按鈕時,會引發兩個事件:Click 和 Command。
按鈕控制元件的基本語法
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Click" / >
按鈕控制元件的常用屬性
| 屬性 | 描述 |
|---|---|
| Text | 按鈕上顯示的文字。這僅適用於按鈕和連結按鈕控制元件。 |
| ImageUrl | 僅適用於影像按鈕控制元件。要為按鈕顯示的影像。 |
| AlternateText | 僅適用於影像按鈕控制元件。如果瀏覽器無法顯示影像,則顯示的文字。 |
| CausesValidation | 確定使用者單擊按鈕時是否發生頁面驗證。預設值為 true。 |
| CommandName | 當用戶單擊按鈕時傳遞給命令事件的字串值。 |
| CommandArgument | 當用戶單擊按鈕時傳遞給命令事件的字串值。 |
| PostBackUrl | 使用者單擊按鈕時請求的頁面的 URL。 |
文字框和標籤
文字框控制元件通常用於接受使用者的輸入。文字框控制元件可以接受一行或多行文字,具體取決於 TextMode 屬性的設定。
標籤控制元件提供了一種簡單的方法來顯示文字,這些文字可以在頁面的每次執行之間更改。如果要顯示不變的文字,則使用文字文字。
文字控制元件的基本語法
<asp:TextBox ID="txtstate" runat="server" ></asp:TextBox>
文字框和標籤的常用屬性
| 屬性 | 描述 |
|---|---|
| TextMode | 指定文字框的型別。SingleLine 建立一個標準文字框,MultiLIne 建立一個接受多行文字的文字框,而 Password 會使輸入的字元被掩蓋。預設值為 SingleLine。 |
| Text | 文字框的文字內容。 |
| MaxLength | 可以輸入到文字框中的最大字元數。 |
| Wrap | 它確定多行文字框中的文字是否自動換行;預設為 true。 |
| ReadOnly | 確定使用者是否可以更改框中的文字;預設為 false,即使用者無法更改文字。 |
| Columns | 文字框的寬度(以字元為單位)。實際寬度根據用於文字輸入的字型確定。 |
| Rows | 多行文字框的高度(以行為單位)。預設值為 0,表示單行文字框。 |
標籤控制元件最常用的屬性是“Text”,它表示標籤上顯示的文字。
複選框和單選按鈕
複選框顯示使用者可以選中或取消選中的單個選項,而單選按鈕則提供一組選項,使用者從中只能選擇一個選項。
要建立一組單選按鈕,請為組中每個單選按鈕的 GroupName 屬性指定相同名稱。如果單個表單中需要多個組,則為每個組指定不同的組名稱。
如果希望在表單最初顯示時選中複選框或單選按鈕,請將其 Checked 屬性設定為 true。如果在一組中為多個單選按鈕設定了 Checked 屬性為 true,則僅最後一個被視為 true。
複選框的基本語法
<asp:CheckBox ID= "chkoption" runat= "Server"> </asp:CheckBox>
單選按鈕的基本語法
<asp:RadioButton ID= "rdboption" runat= "Server"> </asp: RadioButton>
複選框和單選按鈕的常用屬性
| 屬性 | 描述 |
|---|---|
| Text | 複選框或單選按鈕旁邊顯示的文字。 |
| Checked | 指定它是否被選中,預設為 false。 |
| GroupName | 控制元件所屬的組的名稱。 |
列表控制元件
ASP.NET 提供以下控制元件
- 下拉列表,
- 列表框,
- 單選按鈕列表,
- 複選框列表,
- 專案符號列表。
這些控制元件允許使用者從列表中選擇一個或多個專案。列表框和下拉列表包含一個或多個列表項。這些列表可以透過程式碼或 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>
列表框和下拉列表的常用屬性
| 屬性 | 描述 |
|---|---|
| Items | 表示控制元件中專案的 ListItem 物件的集合。此屬性返回型別為 ListItemCollection 的物件。 |
| Rows | 指定框中顯示的專案數。如果實際列表包含的行數超過顯示的行數,則會新增捲軸。 |
| SelectedIndex | 當前選定專案的索引。如果選擇了多個專案,則為第一個選定專案的索引。如果沒有選擇任何專案,則此屬性的值為 -1。 |
| SelectedValue | 當前選定專案的 value。如果選擇了多個專案,則為第一個選定專案的 value。如果沒有選擇任何專案,則此屬性的值為空字串("")。 |
| SelectionMode | 指示列表框是否允許單選或多選。 |
每個列表項物件的常用屬性
| 屬性 | 描述 |
|---|---|
| Text | 為專案顯示的文字。 |
| Selected | 指示專案是否被選中。 |
| Value | 與專案關聯的字串值。 |
需要注意的是
要使用下拉列表或列表框中的專案,請使用控制元件的 Items 屬性。此屬性返回一個 ListItemCollection 物件,其中包含列表的所有專案。
當用戶從下拉列表或列表框中選擇不同的專案時,會引發 SelectedIndexChanged 事件。
ListItemCollection
ListItemCollection 物件是 ListItem 物件的集合。每個 ListItem 物件表示列表中的一個專案。ListItemCollection 中的專案從 0 開始編號。
當使用字串(例如:lstcolor.Items.Add("Blue"))將專案載入到列表框中時,列表項的 Text 和 Value 屬性都設定為指定的字串值。要將其設定為不同的值,必須建立一個列表項物件,然後將該專案新增到集合中。
ListItemCollection 編輯器用於向下拉列表或列表框新增專案。這用於建立專案的靜態列表。要顯示集合編輯器,請從智慧標記選單中選擇“編輯專案”,或選擇控制元件,然後單擊“屬性”視窗中“Item”屬性的省略號按鈕。
ListItemCollection 的常用屬性
| 屬性 | 描述 |
|---|---|
| Item(integer) | 表示指定索引處的專案的 ListItem 物件。 |
| Count | 集合中的專案數。 |
ListItemCollection 的常用方法
| 方法 | 描述 |
|---|---|
| Add(string) | 在集合的末尾新增一個新專案,並將字串引數分配給專案的 Text 屬性。 |
| Add(ListItem) | 在集合的末尾新增一個新專案。 |
| Insert(integer, string) | 在集合中指定的索引位置插入一個專案,並將字串引數分配給專案的 Text 屬性。 |
| Insert(integer, ListItem) | 在集合中指定的索引位置插入專案。 |
| Remove(string) | 刪除文字值與字串相同的專案。 |
| Remove(ListItem) | 刪除指定的專案。 |
| RemoveAt(integer) | 刪除整數作為指定索引處的專案。 |
| Clear | 刪除集合中的所有專案。 |
| FindByValue(string) | 返回其 Value 與字串相同的專案。 |
| FindByValue(Text) | 返回其 Text 與字串相同的專案。 |
單選按鈕列表和複選框列表
單選按鈕列表提供了一組互斥選項。複選框列表提供了一組獨立選項。這些控制元件包含 ListItem 物件的集合,可以透過控制元件的 Items 屬性引用這些物件。
單選按鈕列表的基本語法
<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>
複選框和單選按鈕列表的常用屬性
| 屬性 | 描述 |
|---|---|
| RepeatLayout | 此屬性指定在呈現列表時使用表格標籤還是普通 html 流進行格式化。預設值為 Table。 |
| RepeatDirection | 它指定控制元件重複的方向。可用值為 Horizontal 和 Vertical。預設為 Vertical。 |
| RepeatColumns | 它指定在重複控制元件時使用的列數;預設為 0。 |
專案符號列表和編號列表
專案符號列表控制元件建立專案符號列表或編號列表。這些控制元件包含 ListItem 物件的集合,可以透過控制元件的 Items 屬性引用這些物件。
專案符號列表的基本語法
<asp:BulletedList ID="BulletedList1" runat="server"> </asp:BulletedList>
專案符號列表的常用屬性
| 屬性 | 描述 |
|---|---|
| BulletStyle | 此屬性指定專案符號或數字的樣式和外觀。 |
| RepeatDirection | 它指定控制元件重複的方向。可用值為 Horizontal 和 Vertical。預設為 Vertical。 |
| RepeatColumns | 它指定在重複控制元件時使用的列數;預設為 0。 |
HyperLink 控制元件
HyperLink 控制元件類似於 HTML 的 <a> 元素。
超連結控制元件的基本語法
<asp:HyperLink ID="HyperLink1" runat="server"> HyperLink </asp:HyperLink>
它具有以下重要屬性
| 屬性 | 描述 |
|---|---|
| ImageUrl | 控制元件要顯示的影像路徑。 |
| NavigateUrl | 目標連結 URL。 |
| Text | 要顯示為連結的文字。 |
| Target | 載入連結頁面的視窗或框架。 |
影像控制元件
影像控制元件用於在網頁上顯示影像,或者如果影像不可用,則顯示一些替代文字。
影像控制元件的基本語法
<asp:Image ID="Image1" runat="server">
它具有以下重要屬性
| 屬性 | 描述 |
|---|---|
| AlternateText | 在影像不存在的情況下顯示的替代文字。 |
| ImageAlign | 控制元件的對齊選項。 |
| ImageUrl | 控制元件要顯示的影像路徑。 |
ASP.NET - 指令
ASP.NET 指令是用於指定可選設定的指令,例如註冊自定義控制元件和頁面語言。這些設定描述了 .Net 框架如何處理 Web 窗體 (.aspx) 或使用者控制元件 (.ascx) 頁面。
宣告指令的語法為
<%@ directive_name attribute=value [attribute=value] %>
在本節中,我們將僅介紹 ASP.NET 指令,並且將在整個教程中使用大多數這些指令。
Application 指令
Application 指令定義特定於應用程式的屬性。它位於 global.aspx 檔案的頂部。
Application 指令的基本語法為
<%@ Application Language="C#" %>
Application 指令的屬性為
| Attributes | 描述 |
|---|---|
| Inherits | 要從中繼承的類的名稱。 |
| 描述 | 應用程式的文字描述。解析器和編譯器會忽略此項。 |
| Language | 程式碼塊中使用的語言。 |
Assembly 指令
Assembly 指令在解析時將程式集連結到頁面或應用程式。這可能出現在 global.asax 檔案中以進行應用程式範圍的連結,出現在頁面檔案中,出現在使用者控制元件檔案中以連結到頁面或使用者控制元件。
Assembly 指令的基本語法為
<%@ Assembly Name ="myassembly" %>
Assembly 指令的屬性為
| Attributes | 描述 |
|---|---|
| Name | 要連結的程式集的名稱。 |
| Src | 要動態連結和編譯的原始檔的路徑。 |
Control 指令
Control 指令與使用者控制元件一起使用,並出現在使用者控制元件 (.ascx) 檔案中。
Control 指令的基本語法為
<%@ Control Language="C#" EnableViewState="false" %>
Control 指令的屬性為
| Attributes | 描述 |
|---|---|
| AutoEventWireup | 啟用或停用將事件自動關聯到處理程式的布林值。 |
| ClassName | 控制元件的檔名。 |
| Debug | 啟用或停用使用除錯符號進行編譯的布林值。 |
| 描述 | 控制元件頁面的文字描述,編譯器會忽略。 |
| EnableViewState | 指示是否跨頁面請求維護檢視狀態的布林值。 |
| Explicit | 對於 VB 語言,告訴編譯器使用 Option Explicit 模式。 |
| Inherits | 控制元件頁面繼承的類。 |
| Language | 程式碼和指令碼的語言。 |
| Src | 程式碼隱藏類的檔名。 |
| Strict | 對於 VB 語言,告訴編譯器使用 Option Strict 模式。 |
Implements 指令
Implement 指令指示網頁、母版頁或使用者控制元件頁面必須實現指定的 .Net 框架介面。
Implements 指令的基本語法為
<%@ Implements Interface="interface_name" %>
Import 指令
Import 指令將名稱空間匯入到網頁、使用者控制元件頁面或應用程式中。如果在 global.asax 檔案中指定了 Import 指令,則它將應用於整個應用程式。如果它位於頁面或使用者控制元件頁面中,則它將應用於該頁面或控制元件。
Import 指令的基本語法為
<%@ namespace="System.Drawing" %>
Master 指令
Master 指令指定一個頁面檔案作為母版頁。
示例 MasterPage 指令的基本語法為
<%@ MasterPage Language="C#" AutoEventWireup="true" CodeFile="SiteMater.master.cs" Inherits="SiteMaster" %>
MasterType 指令
MasterType 指令將類名分配給頁面的 Master 屬性,使其成為強型別。
MasterType 指令的基本語法為
<%@ MasterType attribute="value"[attribute="value" ...] %>
OutputCache 指令
OutputCache 指令控制網頁或使用者控制元件的輸出快取策略。
OutputCache 指令的基本語法為
<%@ OutputCache Duration="15" VaryByParam="None" %>
Page 指令
Page 指令定義特定於頁面檔案的屬性,供頁面解析器和編譯器使用。
Page 指令的基本語法為
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Trace="true" %>
Page 指令的屬性為
| Attributes | 描述 |
|---|---|
| AutoEventWireup | 啟用或停用正在自動繫結到方法的頁面事件的布林值;例如,Page_Load。 |
| Buffer | 啟用或停用 HTTP 響應緩衝的布林值。 |
| ClassName | 頁面的類名。 |
| ClientTarget | 伺服器控制元件應為其呈現內容的瀏覽器。 |
| CodeFile | 程式碼隱藏檔案的檔名。 |
| Debug | 啟用或停用使用除錯符號進行編譯的布林值。 |
| 描述 | 頁面的文字描述,解析器會忽略。 |
| EnableSessionState | 啟用、停用或使會話狀態為只讀。 |
| EnableViewState | 啟用或停用跨頁面請求的檢視狀態的布林值。 |
| ErrorPage | 如果發生未處理的頁面異常,則重定向到的 URL。 |
| Inherits | 程式碼隱藏或其他類的名稱。 |
| Language | 程式碼的程式語言。 |
| Src | 程式碼隱藏類的檔名。 |
| Trace | 啟用或停用跟蹤。 |
| TraceMode | 指示如何顯示跟蹤訊息,以及按時間或類別排序。 |
| Transaction | 指示是否支援事務。 |
| ValidateRequest | 指示是否針對硬編碼值列表驗證所有輸入資料的布林值。 |
PreviousPageType 指令
PreviousPageType 指令將類分配給頁面,以便頁面成為強型別。
示例 PreviousPagetype 指令的基本語法為
<%@ PreviousPageType attribute="value"[attribute="value" ...] %>
Reference 指令
Reference 指令指示應編譯另一個頁面或使用者控制元件並將其連結到當前頁面。
Reference 指令的基本語法為
<%@ Reference Page ="somepage.aspx" %>
Register 指令
Register 衍生用於註冊自定義伺服器控制元件和使用者控制元件。
Register 指令的基本語法為
<%@ Register Src="~/footer.ascx" TagName="footer" TagPrefix="Tfooter" %>
ASP.NET - 狀態管理
超文字傳輸協議 (HTTP) 是一種無狀態協議。當客戶端與伺服器斷開連線時,ASP.NET 引擎會丟棄頁面物件。這樣,每個 Web 應用程式都可以擴充套件以同時服務大量請求,而不會耗盡伺服器記憶體。
但是,需要一些技術來儲存請求之間的資訊,並在需要時檢索它。此資訊(即當前使用者在當前會話中所有控制元件和變數的當前值)稱為狀態。
ASP.NET 管理四種類型的狀態
- 檢視狀態
- 控制元件狀態
- 會話狀態
- 應用程式狀態
檢視狀態
檢視狀態是頁面及其所有控制元件的狀態。它由 ASP.NET 框架在帖子之間自動維護。
當頁面傳送回客戶端時,會確定頁面及其控制元件屬性中的更改,並將其儲存在名為 _VIEWSTATE 的隱藏輸入欄位的值中。當頁面再次回傳時,_VIEWSTATE 欄位會與 HTTP 請求一起傳送到伺服器。
可以為以下物件啟用或停用檢視狀態
整個應用程式 透過在 web.config 檔案的 <pages> 部分中設定 EnableViewState 屬性。
頁面 透過設定 Page 指令的 EnableViewState 屬性,如 <%@ Page Language="C#" EnableViewState="false" %>。
控制元件 透過設定 Control.EnableViewState 屬性。
它是使用由 StateBag 類定義的檢視狀態物件實現的,該類定義了檢視狀態項的集合。狀態包是一種資料結構,包含屬性值對,儲存為與物件關聯的字串。
StateBag 類具有以下屬性
| 屬性 | 描述 |
|---|---|
| Item(name) | 具有指定名稱的檢視狀態項的值。這是 StateBag 類的預設屬性。 |
| Count | 檢視狀態集合中的專案數。 |
| Keys | 集合中所有專案的鍵的集合。 |
| Values | 集合中所有專案的值的集合。 |
StateBag 類具有以下方法
| 方法 | 描述 |
|---|---|
| Add(name, value) | 將專案新增到檢視狀態集合中,並更新現有專案。 |
| Clear | 刪除集合中的所有專案。 |
| Equals(Object) | 確定指定的物件是否等於當前物件。 |
| Finalize | 允許它釋放資源並執行其他清理操作。 |
| GetEnumerator | 返回一個列舉器,該列舉器迭代儲存在 StateBag 物件中的所有 StateItem 物件的鍵/值對。 |
| GetType | 獲取當前例項的型別。 |
| IsItemDirty | 檢查儲存在 StateBag 物件中的 StateItem 物件以評估它是否已被修改。 |
| Remove(name) | 刪除指定的專案。 |
| SetDirty | 設定 StateBag 物件的狀態以及它包含的每個 StateItem 物件的 Dirty 屬性。 |
| SetItemDirty | 設定 StateBag 物件中指定 StateItem 物件的 Dirty 屬性。 |
| ToString | 返回表示狀態包物件的字串。 |
示例
以下示例演示了儲存檢視狀態的概念。讓我們保留一個計數器,每次透過單擊頁面上的按鈕回傳頁面時都會遞增該計數器。標籤控制元件顯示計數器中的值。
標記檔案程式碼如下所示
<%@ 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++;
}
}
它將產生以下結果
控制元件狀態
控制元件狀態無法修改、直接訪問或停用。
會話狀態
當用戶連線到 ASP.NET 網站時,會建立一個新的會話物件。當會話狀態開啟時,會為每個新請求建立一個新的會話狀態物件。此會話狀態物件成為上下文的一部分,並且可以透過頁面訪問。
會話狀態通常用於儲存應用程式資料,例如庫存、供應商列表、客戶記錄或購物車。它還可以保留有關使用者及其偏好的資訊,並跟蹤未完成的操作。
會話透過 120 位的 SessionID 進行標識和跟蹤,該 ID 作為 Cookie 或修改後的 URL 從客戶端傳遞到伺服器,然後再傳回。SessionID 是全域性唯一的且隨機的。
會話狀態物件由 HttpSessionState 類建立,該類定義了會話狀態項的集合。
HttpSessionState 類具有以下屬性
| 屬性 | 描述 |
|---|---|
| SessionID | 唯一的會話識別符號。 |
| Item(name) | 具有指定名稱的會話狀態項的值。這是 HttpSessionState 類的預設屬性。 |
| Count | 會話狀態集合中的專案數。 |
| TimeOut | 獲取和設定請求之間允許的時間(以分鐘為單位),在此時間之後,會話狀態提供程式將終止會話。 |
HttpSessionState 類具有以下方法
| 方法 | 描述 |
|---|---|
| Add(name, value) | 將專案新增到會話狀態集合中。 |
| Clear | 從會話狀態集合中刪除所有專案。 |
| Remove(name) | 從會話狀態集合中刪除指定的專案。 |
| RemoveAll | 移除會話狀態集合中的所有鍵和值。 |
| RemoveAt | 從會話狀態集合中刪除指定索引處的項。 |
會話狀態物件是用於儲存和檢索會話狀態物件中某些資訊的名稱-值對。您可以使用以下程式碼實現相同的功能。
void StoreSessionInfo()
{
String fromuser = TextBox1.Text;
Session["fromuser"] = fromuser;
}
void RetrieveSessionInfo()
{
String fromuser = Session["fromuser"];
Label1.Text = fromuser;
}
以上程式碼僅在 Session 字典物件中儲存字串,但是,它可以儲存所有基本資料型別和由基本資料型別組成的陣列,以及 DataSet、DataTable、HashTable 和 Image 物件,以及任何從 ISerializable 物件繼承的使用者定義類。
示例
以下示例演示了儲存會話狀態的概念。頁面上有兩個按鈕,一個用於輸入字串的文字框和一個用於顯示從上次會話儲存的文字的標籤。
標記檔案程式碼如下所示
<%@ 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"];
}
}
執行檔案並觀察其工作原理
應用程式狀態
ASP.NET 應用程式是 Web 伺服器上單個虛擬目錄中所有網頁、程式碼和其他檔案的集合。當資訊儲存在應用程式狀態中時,所有使用者都可以訪問它。
為了提供應用程式狀態的使用,ASP.NET 為每個應用程式從 HTTPApplicationState 類建立一個應用程式狀態物件,並將此物件儲存在伺服器記憶體中。此物件由類檔案 global.asax 表示。
應用程式狀態主要用於儲存點選計數器和其他統計資料、全域性應用程式資料(如稅率、折扣率等)以及跟蹤訪問站點的使用者。
HttpApplicationState 類具有以下屬性
| 屬性 | 描述 |
|---|---|
| Item(name) | 具有指定名稱的應用程式狀態項的值。這是 HttpApplicationState 類的預設屬性。 |
| Count | 應用程式狀態集合中的專案數。 |
HttpApplicationState 類具有以下方法
| 方法 | 描述 |
|---|---|
| Add(name, value) | 嚮應用程式狀態集合新增一項。 |
| Clear | 從應用程式狀態集合中移除所有項。 |
| Remove(name) | 從應用程式狀態集合中移除指定的項。 |
| RemoveAll | 從 HttpApplicationState 集合中移除所有物件。 |
| RemoveAt | 透過索引從集合中移除 HttpApplicationState 物件。 |
| Lock() | 鎖定應用程式狀態集合,以便只有當前使用者可以訪問它。 |
| Unlock() | 解鎖應用程式狀態集合,以便所有使用者都可以訪問它。 |
應用程式狀態資料通常透過為以下事件編寫處理程式來維護
- 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 - 驗證器
ASP.NET 驗證控制元件驗證使用者輸入資料,以確保不會儲存無用、未經身份驗證或矛盾的資料。
ASP.NET 提供以下驗證控制元件
- RequiredFieldValidator
- RangeValidator
- CompareValidator
- RegularExpressionValidator
- CustomValidator
- ValidationSummary
BaseValidator 類
驗證控制元件類繼承自 BaseValidator 類,因此它們繼承了其屬性和方法。因此,檢視此基類的屬性和方法將有所幫助,這些屬性和方法對於所有驗證控制元件都是通用的
| 成員 | 描述 |
|---|---|
| ControlToValidate | 指示要驗證的輸入控制元件。 |
| Display | 指示如何顯示錯誤訊息。 |
| EnableClientScript | 指示是否啟用客戶端驗證。 |
| Enabled | 啟用或停用驗證器。 |
| ErrorMessage | 指示錯誤字串。 |
| Text | 如果驗證失敗,則顯示的錯誤文字。 |
| IsValid | 指示控制元件的值是否有效。 |
| SetFocusOnError | 它指示在無效控制元件的情況下,焦點是否應切換到相關的輸入控制元件。 |
| ValidationGroup | 此控制元件所屬的多個驗證器的邏輯組。 |
| Validate() | 此方法重新驗證控制元件並更新 IsValid 屬性。 |
RequiredFieldValidator 控制元件
RequiredFieldValidator 控制元件確保必填欄位不為空。它通常與文字框繫結,以強制輸入文字框。
控制元件的語法如下所示
<asp:RequiredFieldValidator ID="rfvcandidate" runat="server" ControlToValidate ="ddlcandidate" ErrorMessage="Please choose a candidate" InitialValue="Please choose a candidate"> </asp:RequiredFieldValidator>
RangeValidator 控制元件
RangeValidator 控制元件驗證輸入值是否在預定的範圍內。
它具有三個特定屬性
| 屬性 | 描述 |
|---|---|
| Type | 它定義資料型別。可用值為:Currency、Date、Double、Integer 和 String。 |
| MinimumValue | 它指定範圍的最小值。 |
| MaximumValue | 它指定範圍的最大值。 |
控制元件的語法如下所示
<asp:RangeValidator ID="rvclass" runat="server" ControlToValidate="txtclass" ErrorMessage="Enter your class (6 - 12)" MaximumValue="12" MinimumValue="6" Type="Integer"> </asp:RangeValidator>
CompareValidator 控制元件
CompareValidator 控制元件將一個控制元件中的值與固定值或另一個控制元件中的值進行比較。
它具有以下特定屬性
| 屬性 | 描述 |
|---|---|
| Type | 它指定資料型別。 |
| ControlToCompare | 它指定要比較的輸入控制元件的值。 |
| ValueToCompare | 它指定要比較的常量值。 |
| Operator | 它指定比較運算子,可用值為:Equal、NotEqual、GreaterThan、GreaterThanEqual、LessThan、LessThanEqual 和 DataTypeCheck。 |
控制元件的基本語法如下所示
<asp:CompareValidator ID="CompareValidator1" runat="server" ErrorMessage="CompareValidator"> </asp:CompareValidator>
RegularExpressionValidator
RegularExpressionValidator 允許透過與正則表示式的模式匹配來驗證輸入文字。正則表示式在 ValidationExpression 屬性中設定。
下表總結了正則表示式常用的語法結構
| 字元轉義 | 描述 |
|---|---|
| \b | 匹配退格鍵。 |
| \t | 匹配製表符。 |
| \r | 匹配回車鍵。 |
| \v | 匹配垂直製表符。 |
| \f | 匹配換頁符。 |
| \n | 匹配換行符。 |
| \ | 跳脫字元。 |
除了單個字元匹配之外,還可以指定可以匹配的一類字元,稱為元字元。
| 元字元 | 描述 |
|---|---|
| . | 匹配除 \n 之外的任何字元。 |
| [abcd] | 匹配集合中的任何字元。 |
| [^abcd] | 排除集合中的任何字元。 |
| [2-7a-mA-M] | 匹配範圍內指定的任何字元。 |
| \w | 匹配任何字母數字字元和下劃線。 |
| \W | 匹配任何非單詞字元。 |
| \s | 匹配空格字元,如空格、製表符、換行符等。 |
| \S | 匹配任何非空格字元。 |
| \d | 匹配任何十進位制字元。 |
| \D | 匹配任何非十進位制字元。 |
可以新增限定符來指定字元可以出現的次數。
| 限定符 | 描述 |
|---|---|
| * | 零個或多個匹配。 |
| + | 一個或多個匹配。 |
| ? | 零個或一個匹配。 |
| {N} | N 個匹配。 |
| {N,} | N 個或更多匹配。 |
| {N,M} | N 到 M 之間的匹配。 |
控制元件的語法如下所示
<asp:RegularExpressionValidator ID="string" runat="server" ErrorMessage="string" ValidationExpression="string" ValidationGroup="string"> </asp:RegularExpressionValidator>
CustomValidator
CustomValidator 控制元件允許為客戶端和伺服器端驗證編寫應用程式特定的自定義驗證例程。
客戶端驗證透過 ClientValidationFunction 屬性完成。客戶端驗證例程應使用瀏覽器可以理解的指令碼語言(如 JavaScript 或 VBScript)編寫。
伺服器端驗證例程必須從控制元件的 ServerValidate 事件處理程式中呼叫。伺服器端驗證例程應使用任何 .Net 語言(如 C# 或 VB.Net)編寫。
控制元件的基本語法如下所示
<asp:CustomValidator ID="CustomValidator1" runat="server" ClientValidationFunction=.cvf_func. ErrorMessage="CustomValidator"> </asp:CustomValidator>
ValidationSummary
ValidationSummary 控制元件不執行任何驗證,但顯示頁面中所有錯誤的摘要。摘要顯示所有驗證失敗的驗證控制元件的 ErrorMessage 屬性的值。
以下兩個互斥屬性列出了錯誤訊息
ShowSummary:以指定的格式顯示錯誤訊息。
ShowMessageBox:在單獨的視窗中顯示錯誤訊息。
控制元件的語法如下所示
<asp:ValidationSummary ID="ValidationSummary1" runat="server" DisplayMode = "BulletList" ShowSummary = "true" HeaderText="Errors:" />
驗證組
複雜的頁面在不同的面板中提供了不同的資訊組。在這種情況下,可能需要分別對不同的組執行驗證。這種型別的場景是使用驗證組處理的。
要建立驗證組,您應該透過設定其ValidationGroup屬性將輸入控制元件和驗證控制元件放入同一個邏輯組中。
示例
以下示例描述了一個由學校的所有學生(分為四個學院)填寫以選舉校長候選人的表格。在這裡,我們使用驗證控制元件來驗證使用者輸入。
這是設計檢視中的表單
內容檔案程式碼如下所示
<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 - 資料庫訪問
ASP.NET 允許訪問和使用以下資料來源
- 資料庫(例如,Access、SQL Server、Oracle、MySQL)
- XML 文件
- 業務物件
- 平面檔案
ASP.NET 隱藏了複雜的資料訪問過程,並透過其輕鬆訪問資料的更高級別的類和物件提供了更高的級別。這些類隱藏了連線、資料檢索、資料查詢和資料操作的所有複雜編碼。
ADO.NET 是一項技術,它在各種 ASP.NET 控制元件物件和後端資料來源之間架起橋樑。在本教程中,我們將簡要介紹資料訪問和資料處理。
檢索和顯示資料
它需要兩種型別的資料控制元件來在 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 和高階按鈕。這些按鈕允許您分別提供 where 子句、order by 子句並指定 SQL 的插入、更新和刪除命令。這樣,您就可以操作資料。
(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="None">
<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 在前端控制元件和後端資料庫之間架起了一座橋樑。ADO.NET 物件封裝了所有資料訪問操作,控制元件與這些物件互動以顯示資料,從而隱藏了資料移動的細節。
下圖概述了 ADO.NET 物件
DataSet 類
資料集表示資料庫的一個子集。它沒有與資料庫的持續連線。要更新資料庫,需要重新連線。DataSet 包含 DataTable 物件和 DataRelation 物件。DataRelation 物件表示兩個表之間的關係。
下表顯示了 DataSet 類的一些重要屬性
| 屬性 | 描述 |
|---|---|
| CaseSensitive | 指示資料表中的字串比較是否區分大小寫。 |
| Container | 獲取元件的容器。 |
| DataSetName | 獲取或設定當前資料集的名稱。 |
| DefaultViewManager | 返回資料集中的資料檢視。 |
| DesignMode | 指示元件當前是否處於設計模式。 |
| EnforceConstraints | 指示在嘗試任何更新操作時是否遵循約束規則。 |
| Events | 獲取附加到此元件的事件處理程式列表。 |
| ExtendedProperties | 獲取與 DataSet 關聯的自定義使用者資訊集合。 |
| HasErrors | 指示是否存在任何錯誤。 |
| IsInitialized | 指示 DataSet 是否已初始化。 |
| Locale | 獲取或設定用於在表內比較字串的區域性資訊。 |
| Namespace | 獲取或設定 DataSet 的名稱空間。 |
| Prefix | 獲取或設定一個 XML 字首,該字首為 DataSet 的名稱空間指定別名。 |
| Relations | 返回 DataRelation 物件的集合。 |
| Tables | 返回 DataTable 物件的集合。 |
下表顯示了 DataSet 類的一些重要方法
| 方法 | 描述 |
|---|---|
| AcceptChanges | 接受自 DataSet 載入或上次呼叫此方法以來所做的所有更改。 |
| BeginInit | 開始 DataSet 的初始化。初始化在執行時發生。 |
| Clear | 清除資料。 |
| Clone | 複製 DataSet 的結構,包括所有 DataTable 架構、關係和約束。不復制任何資料。 |
| Copy | 複製結構和資料。 |
| CreateDataReader() | 返回一個 DataTableReader,每個 DataTable 一個結果集,與表在 Tables 集合中出現的順序相同。 |
| CreateDataReader(DataTable[]) | 返回一個 DataTableReader,每個 DataTable 一個結果集。 |
| EndInit | 結束資料集的初始化。 |
| Equals(Object) | 確定指定的 Object 是否等於當前 Object。 |
| Finalize | 釋放資源並執行其他清理操作。 |
| GetChanges | 返回 DataSet 的副本,其中包含自載入或呼叫 AcceptChanges 方法以來所做的所有更改。 |
| GetChanges(DataRowState) | 獲取 DataSet 的副本,其中包含自載入或呼叫 AcceptChanges 方法以來所做的所有更改,並按 DataRowState 過濾。 |
| GetDataSetSchema | 獲取 DataSet 的 XmlSchemaSet 副本。 |
| GetObjectData | 使用序列化 DataSet 所需的資料填充序列化資訊物件。 |
| GetType | 獲取當前例項的型別。 |
| GetXML | 返回資料的 XML 表示形式。 |
| GetXMLSchema | 返回資料的 XML 表示形式的 XSD 架構。 |
| HasChanges() | 獲取一個值,該值指示 DataSet 是否有更改,包括新行、已刪除行或已修改行。 |
| HasChanges(DataRowState) | 獲取一個值,該值指示 DataSet 是否有更改,包括新行、已刪除行或已修改行,並按 DataRowState 過濾。 |
| IsBinarySerialized | 檢查 DataSet 的序列化表示形式的格式。 |
| Load(IDataReader, LoadOption, DataTable[]) | 使用提供的 IDataReader 從資料來源填充 DataSet,使用 DataTable 例項陣列提供架構和名稱空間資訊。 |
| Load(IDataReader, LoadOption, String[]) | 使用提供的 IDataReader 從資料來源填充 DataSet,使用字串陣列提供 DataSet 中表的名稱。 |
| Merge() | 將資料與來自另一個 DataSet 的資料合併。此方法具有不同的過載形式。 |
| ReadXML() | 將 XML 架構和資料讀取到 DataSet 中。此方法具有不同的過載形式。 |
| ReadXMLSchema(0) | 將 XML 架構讀取到 DataSet 中。此方法具有不同的過載形式。 |
| RejectChanges | 回滾自上次呼叫 AcceptChanges 以來所做的所有更改。 |
| WriteXML() | 從 DataSet 寫入 XML 架構和資料。此方法具有不同的過載形式。 |
| WriteXMLSchema() | 將 DataSet 的結構作為 XML 架構寫入。此方法具有不同的過載形式。 |
DataTable 類
DataTable 類表示資料庫中的表。它具有以下重要屬性;除了 PrimaryKey 屬性外,大多數屬性都是隻讀屬性
| 屬性 | 描述 |
|---|---|
| ChildRelations | 返回子關係的集合。 |
| Columns | 返回 Columns 集合。 |
| Constraints | 返回 Constraints 集合。 |
| DataSet | 返回父 DataSet。 |
| DefaultView | 返回表的檢視。 |
| ParentRelations | 返回 ParentRelations 集合。 |
| PrimaryKey | 獲取或設定一組列作為表的主鍵。 |
| Rows | 返回 Rows 集合。 |
下表顯示了 DataTable 類的一些重要方法
| 方法 | 描述 |
|---|---|
| AcceptChanges | 提交自上次 AcceptChanges 以來所做的所有更改。 |
| Clear | 清除表中的所有資料。 |
| GetChanges | 返回 DataTable 的副本,其中包含自呼叫 AcceptChanges 方法以來所做的所有更改。 |
| GetErrors | 返回包含錯誤的行陣列。 |
| ImportRows | 將新行復制到表中。 |
| LoadDataRow | 查詢並更新特定行,如果未找到任何行,則建立新行。 |
| Merge | 將表與另一個 DataTable 合併。 |
| NewRow | 建立一個新的 DataRow。 |
| RejectChanges | 回滾自上次呼叫 AcceptChanges 以來所做的所有更改。 |
| Reset | 將表重置為其原始狀態。 |
| Select | 返回 DataRow 物件陣列。 |
DataRow 類
DataRow 物件表示表中的一行。它具有以下重要屬性
| 屬性 | 描述 |
|---|---|
| HasErrors | 指示是否存在任何錯誤。 |
| Items | 獲取或設定儲存在特定列中的資料。 |
| ItemArrays | 獲取或設定行的所有值。 |
| Table | 返回父表。 |
下表顯示了 DataRow 類的一些重要方法
| 方法 | 描述 |
|---|---|
| AcceptChanges | 接受自上次呼叫此方法以來所做的所有更改。 |
| BeginEdit | 開始編輯操作。 |
| CancelEdit | 取消編輯操作。 |
| Delete | 刪除 DataRow。 |
| EndEdit | 結束編輯操作。 |
| GetChildRows | 獲取此行的子行。 |
| GetParentRow | 獲取父行。 |
| GetParentRows | 獲取 DataRow 物件的父行。 |
| RejectChanges | 回滾自上次呼叫 AcceptChanges 以來所做的所有更改。 |
DataAdapter 物件
DataAdapter 物件充當 DataSet 物件和資料庫之間的中介。這有助於 DataSet 包含來自多個數據庫或其他資料來源的資料。
DataReader 物件
DataReader 物件是 DataSet 和 DataAdapter 組合的替代方案。此物件提供對資料庫中資料記錄的面向連線的訪問。這些物件適用於只讀訪問,例如填充列表,然後斷開連線。
DbCommand 和 DbConnection 物件
DbConnection 物件表示與資料來源的連線。可以在不同的命令物件之間共享連線。
DbCommand 物件表示從檢索或操作資料傳送到資料庫的命令或儲存過程。
示例
到目前為止,我們已經使用了計算機中已存在的表和資料庫。在此示例中,我們將建立一個表,新增列、行和資料,並使用 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);
}
}
}
執行程式時,請觀察以下內容
應用程式首先建立一個數據集,並使用 GridView 控制元件的 DataBind() 方法將其繫結到網格檢視控制元件。
Createdataset() 方法是使用者定義的函式,它建立一個新的 DataSet 物件,然後呼叫另一個使用者定義的方法 CreateStudentTable() 來建立表並將其新增到資料集的 Tables 集合中。
CreateStudentTable() 方法呼叫使用者定義的方法 AddNewColumn() 和 AddNewRow() 來建立表的列和行,以及將資料新增到行中。
執行頁面時,它將返回表中的行,如所示
ASP.NET - 檔案上傳
ASP.NET 有兩個控制元件允許使用者將檔案上傳到 Web 伺服器。伺服器接收到釋出的檔案資料後,應用程式可以儲存、檢查或忽略它。以下控制元件允許檔案上傳
HtmlInputFile - 一個 HTML 伺服器控制元件
FileUpload - 一個 ASP.NET Web 控制元件
這兩個控制元件都允許檔案上傳,但 FileUpload 控制元件會自動設定表單的編碼,而 HtmlInputFile 不會。
在本教程中,我們使用 FileUpload 控制元件。FileUpload 控制元件允許使用者瀏覽並選擇要上傳的檔案,提供一個瀏覽按鈕和一個用於輸入檔名的文字框。
一旦使用者透過鍵入名稱或瀏覽在文字框中輸入檔名,就可以呼叫 FileUpload 控制元件的 SaveAs 方法將檔案儲存到磁碟。
FileUpload 的基本語法如下
<asp:FileUpload ID= "Uploader" runat = "server" />
FileUpload 類派生自 WebControl 類,並繼承其所有成員。除此之外,FileUpload 類還具有以下只讀屬性
| 屬性 | 描述 |
|---|---|
| FileBytes | 返回要上傳的檔案中的位元組陣列。 |
| FileContent | 返回指向要上傳檔案的流物件。 |
| FileName | 返回要上傳的檔名。 |
| HasFile | 指定控制元件是否要上傳檔案。 |
| PostedFile | 返回對上傳檔案的引用。 |
已釋出的檔案封裝在型別為 HttpPostedFile 的物件中,可以透過 FileUpload 類的 PostedFile 屬性訪問。
HttpPostedFile 類具有以下常用屬性
| 屬性 | 描述 |
|---|---|
| ContentLength | 返回上傳檔案的大小(以位元組為單位)。 |
| ContentType | 返回上傳檔案的 MIME 型別。 |
| FileName | 返回完整的檔名。 |
| InputStream | 返回指向上傳檔案的流物件。 |
示例
以下示例演示了 FileUpload 控制元件及其屬性。該表單包含一個 FileUpload 控制元件以及一個儲存按鈕和一個用於顯示檔名、檔案型別和檔案長度的標籤控制元件。
在設計檢視中,表單如下所示
內容檔案程式碼如下所示
<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 - 廣告輪播
AdRotator 控制元件從列表中隨機選擇橫幅圖形,該列表在外部 XML 計劃檔案中指定。此外部 XML 計劃檔案稱為廣告檔案。
AdRotator 控制元件允許您分別在 AdvertisementFile 和 Target 屬性中指定廣告檔案以及連結應遵循的視窗型別。
新增 AdRotator 的基本語法如下
<asp:AdRotator runat = "server" AdvertisementFile = "adfile.xml" Target = "_blank" />
在詳細介紹 AdRotator 控制元件及其屬性之前,讓我們先了解一下廣告檔案的構造。
廣告檔案
廣告檔案是一個 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 元素
| 元素 | 描述 |
|---|---|
| Advertisements | 包含廣告檔案。 |
| Ad | 描繪單獨的廣告。 |
| ImageUrl | 將顯示的影像路徑。 |
| NavigateUrl | 使用者單擊廣告時將遵循的連結。 |
| AlternateText | 如果無法顯示圖片,將顯示的文字。 |
| Keyword | 標識廣告組的關鍵字。用於過濾。 |
| Impressions | 指示廣告出現次數的數字。 |
| Height | 要顯示的影像的高度。 |
| Width | 要顯示的影像的寬度。 |
除了這些標記外,還可以包含具有自定義屬性的自定義標記。以下程式碼說明了一個廣告檔案 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>
AdRotator 類的屬性和事件
AdRotator 類派生自 WebControl 類並繼承其屬性。除此之外,AdRotator 類還具有以下屬性
| 屬性 | 描述 |
|---|---|
| AdvertisementFile | 廣告檔案的路徑。 |
| AlternateTextFeild | 提供備用文字的欄位的元素名稱。預設值為 AlternateText。 |
| DataMember | 未使用廣告檔案時要繫結的特定資料列表的名稱。 |
| DataSource | 從中檢索資料的控制元件。 |
| DataSourceID | 從中檢索資料的控制元件的 ID。 |
| Font | 指定與廣告橫幅控制元件關聯的字型屬性。 |
| ImageUrlField | 提供影像 URL 的欄位的元素名稱。預設值為 ImageUrl。 |
| KeywordFilter | 僅顯示基於關鍵字的廣告。 |
| NavigateUrlField | 提供要導航到的 URL 的欄位的元素名稱。預設值為 NavigateUrl。 |
| Target | 顯示頁面連結內容的瀏覽器視窗或框架。 |
| UniqueID | 獲取 AdRotator 控制元件的唯一分層限定識別符號。 |
以下是 AdRotator 類的重要事件
| Events | 描述 |
|---|---|
| AdCreated | 在控制元件建立後但在頁面呈現之前,每個往返伺服器都會引發一次 |
| DataBinding | 伺服器控制元件繫結到資料來源時發生。 |
| DataBound | 伺服器控制元件繫結到資料來源後發生。 |
| Disposed | 伺服器控制元件從記憶體中釋放時發生,這是請求 ASP.NET 頁面時伺服器控制元件生命週期的最後階段 |
| Init | 伺服器控制元件初始化時發生,這是其生命週期的第一步。 |
| Load | 伺服器控制元件載入到 Page 物件中時發生。 |
| PreRender | Control 物件載入後但在呈現之前發生。 |
| Unload | 伺服器控制元件從記憶體中解除安裝時發生。 |
使用 AdRotator 控制元件
建立一個新的網頁並在其上放置一個 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 - 日曆控制元件
日曆控制元件是一個功能豐富的 Web 控制元件,它提供以下功能
- 一次顯示一個月
- 選擇一天、一週或一個月
- 選擇一系列日期
- 在月份之間移動
- 以程式設計方式控制日期的顯示
日曆控制元件的基本語法如下
<asp:Calender ID = "Calendar1" runat = "server"> </asp:Calender>
日曆控制元件的屬性和事件
日曆控制元件有許多屬性和事件,您可以使用它們來自定義控制元件的操作和顯示。下表提供了一些日曆控制元件的重要屬性
| 屬性 | 描述 | |
|---|---|---|
| Caption | 獲取或設定日曆控制元件的標題。 | |
| CaptionAlign | 獲取或設定標題的對齊方式。 | |
| CellPadding | 獲取或設定資料和單元格邊框之間的空格數。 | |
| CellSpacing | 獲取或設定單元格之間的間距。 | |
| DayHeaderStyle | 獲取顯示星期幾的部分的樣式屬性。 | |
| DayNameFormat | 獲取或設定星期的格式。 | |
| DayStyle | 獲取顯示月份中的日期的樣式屬性。 | |
| FirstDayOfWeek | 獲取或設定要在第一列中顯示的星期幾。 | |
| NextMonthText | 獲取或設定下一個月導航控制元件的文字。預設值為 >。 | |
| NextPrevFormat | 獲取或設定下一個月和上一個月的導航控制元件的格式。 | |
| OtherMonthDayStyle | 獲取日曆控制元件上不在顯示月份中的日期的樣式屬性。 | |
| PrevMonthText | 獲取或設定上一個月的導航控制元件的文字。預設值為 <。 | |
| SelectedDate | 獲取或設定選定的日期。 | |
| SelectedDates | 獲取表示所選日期的 DateTime 物件集合。 | |
| SelectedDayStyle | 獲取所選日期的樣式屬性。 | |
| SelectionMode | 獲取或設定選擇模式,該模式指定使用者是否可以選擇單個日期、一週或整個月。 | |
| SelectMonthText | 獲取或設定選擇器列中月份選擇元素的文字。 | |
| SelectorStyle | 獲取星期和月份選擇器列的樣式屬性。 | |
| SelectWeekText | 獲取或設定選擇器列中星期選擇元素顯示的文字。 | |
| ShowDayHeader | 獲取或設定一個值,該值指示是否顯示星期幾的標題。 | |
| ShowGridLines | 獲取或設定一個值,該值指示是否顯示網格線。 | |
| ShowNextPrevMonth | 獲取或設定一個值,該值指示標題部分中是否顯示下一個月和上一個月的導航元素。 | |
| ShowTitle | 獲取或設定一個值,該值指示是否顯示標題部分。 | |
| TitleFormat | 獲取或設定標題部分的格式。 | |
| Titlestyle | 獲取日曆控制元件標題標題的樣式屬性。 | |
| TodayDayStyle | 獲取日曆控制元件上今天日期的樣式屬性。 | |
| TodaysDate | 獲取或設定今天日期的值。 | |
| UseAccessibleHeader | 獲取或設定一個值,該值指示是否為日期標題呈現表格標題 | |
| VisibleDate | 獲取或設定指定要顯示月份的日期。 | |
| WeekendDayStyle | 獲取日曆控制元件上週末日期的樣式屬性。 |
日曆控制元件具有以下三個最重要的事件,允許開發人員對日曆控制元件進行程式設計。它們是
| Events | 描述 |
|---|---|
| SelectionChanged | 選擇一天、一週或整個月時引發。 |
| DayRender | 渲染日曆控制元件的每個資料單元格時引發。 |
| VisibleMonthChanged | 使用者更改月份時引發。 |
使用日曆控制元件
放置一個沒有任何程式碼隱藏檔案的裸日曆控制元件會為網站提供一個可用的日曆,該日曆顯示一年中的月份和日期。它還允許導航到下一個月和上一個月。
日曆控制元件允許使用者選擇單個日期、一週或整個月。這是透過使用 SelectionMode 屬性實現的。此屬性具有以下值
| 屬性 | 描述 |
|---|---|
| Day | 選擇單個日期。 |
| DayWeek | 選擇單個日期或整個星期。 |
| DayWeekMonth | 選擇單個日期、一週或整個月。 |
| None | 無法選擇任何內容。 |
選擇日期的語法
<asp:Calender ID = "Calendar1" runat = "server" SelectionMode="DayWeekMonth"> </asp:Calender>
當選擇模式設定為 DayWeekMonth 值時,會顯示一個帶有 > 符號的額外列用於選擇星期,並在日期名稱左側顯示 >> 符號用於選擇月份。
示例
以下示例演示瞭如何選擇日期並在標籤中顯示日期
內容檔案程式碼如下
<%@ 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>
事件 SelectionChanged 的事件處理程式
protected void Calendar1_SelectionChanged(object sender, EventArgs e)
{
lblday.Text = Calendar1.TodaysDate.ToShortDateString();
lblbday.Text = Calendar1.SelectedDate.ToShortDateString();
}
執行檔案後,應產生以下輸出
ASP.NET - 多檢視
MultiView 和 View 控制元件允許您將頁面的內容劃分為不同的組,並一次只顯示一個組。每個 View 控制元件管理一組內容,所有 View 控制元件都包含在 MultiView 控制元件中。
MultiView 控制元件負責一次顯示一個 View 控制元件。顯示的 View 稱為活動檢視。
MultiView 控制元件的語法為
<asp:MultView ID= "MultiView1" runat= "server"> </asp:MultiView>
View 控制元件的語法為
<asp:View ID= "View1" runat= "server"> </asp:View>
但是,View 控制元件不能獨立存在。如果您嘗試單獨使用它,則會渲染錯誤。它始終與 Multiview 控制元件一起使用,如下所示:
<asp:MultView ID= "MultiView1" runat= "server"> <asp:View ID= "View1" runat= "server"> </asp:View> </asp:MultiView>
View 和 MultiView 控制元件的屬性
View 和 MultiView 控制元件都派生自 Control 類,並繼承其所有屬性、方法和事件。View 控制元件最重要的屬性是布林型別的 Visible 屬性,它設定檢視的可見性。
MultiView 控制元件具有以下重要屬性
| 屬性 | 描述 |
|---|---|
| Views | MultiView 中的 View 控制元件集合。 |
| ActiveViewIndex | 一個基於零的索引,表示活動檢視。如果沒有任何檢視處於活動狀態,則索引為 -1。 |
與 MultiView 控制元件的導航關聯的按鈕控制元件的 CommandName 屬性與 MultiView 控制元件的一些相關欄位關聯。
例如,如果一個 CommandName 值為 NextView 的按鈕控制元件與 multiview 的導航相關聯,則當單擊該按鈕時,它會自動導航到下一個檢視。
下表顯示了上述屬性的預設命令名稱
| 屬性 | 描述 |
|---|---|
| NextViewCommandName | NextView |
| PreviousViewCommandName | PrevView |
| SwitchViewByIDCommandName | SwitchViewByID |
| SwitchViewByIndexCommandName | SwitchViewByIndex |
Multiview 控制元件的重要方法是
| 方法 | 描述 |
|---|---|
| SetActiveview | 設定活動檢視 |
| GetActiveview | 檢索活動檢視 |
每次更改檢視時,頁面都會回發到伺服器,並引發許多事件。一些重要的事件是
| Events | 描述 |
|---|---|
| ActiveViewChanged | 更改檢視時引發 |
| Activate | 由活動檢視引發 |
| Deactivate | 由非活動檢視引發 |
除了上述屬性、方法和事件之外,multiview 控制元件還繼承了 control 和 object 類的成員。
示例
示例頁面包含三個檢視。每個檢視都有兩個按鈕用於在檢視之間導航。
內容檔案程式碼如下
<%@ 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 控制元件充當頁面上其他控制元件的容器。它控制其包含的控制元件的外觀和可見性。它還允許以程式設計方式生成控制元件。
Panel 控制元件的基本語法如下
<asp:Panel ID= "Panel1" runat = "server"> </asp:Panel>
Panel 控制元件派生自 WebControl 類。因此,它繼承了相同類的所有屬性、方法和事件。它本身沒有任何方法或事件。但是,它具有以下自己的屬性
| 屬性 | 描述 |
|---|---|
| BackImageUrl | 面板背景影像的 URL。 |
| DefaultButton | 獲取或設定 Panel 控制元件中包含的預設按鈕的識別符號。 |
| Direction | 面板中的文字方向。 |
| GroupingText | 允許將文字作為欄位進行分組。 |
| HorizontalAlign | 面板中內容的水平對齊方式。 |
| ScrollBars | 指定面板內捲軸的可見性和位置。 |
| Wrap | 允許文字換行。 |
使用 Panel 控制元件
讓我們從一個具有特定高度和寬度的簡單可滾動面板以及邊框樣式開始。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>
面板呈現如下
示例
以下示例演示了動態內容生成。使用者提供要在面板上生成的標籤控制元件和文字框的數量。控制元件是透過程式設計方式生成的。
使用屬性視窗更改面板的屬性。當您在設計檢視中選擇一個控制元件時,屬性視窗會顯示該特定控制元件的屬性,並允許您進行更改,而無需鍵入。
示例的原始檔如下
<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>
Page_Load 事件後面的程式碼負責動態生成控制元件
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 控制元件
AJAX 代表非同步 JavaScript 和 XML。這是一種跨平臺技術,可以加快響應時間。AJAX 伺服器控制元件向頁面新增指令碼,該指令碼由瀏覽器執行和處理。
但是,與其他 ASP.NET 伺服器控制元件一樣,這些 AJAX 伺服器控制元件也可以擁有與其關聯的方法和事件處理程式,這些方法和事件處理程式在伺服器端處理。
Visual Studio IDE 中的控制元件工具箱包含一組名為“AJAX 擴充套件”的控制元件
ScriptManager 控制元件
ScriptManager 控制元件是最重要的控制元件,其他控制元件必須在頁面上存在才能工作。
它具有以下基本語法
<asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager>
如果您從“新增項”對話方塊建立“啟用 Ajax 的站點”或新增“AJAX Web 窗體”,則 Web 窗體將自動包含 ScriptManager 控制元件。ScriptManager 控制元件負責所有伺服器端控制元件的客戶端指令碼。
UpdatePanel 控制元件
UpdatePanel 控制元件是一個容器控制元件,派生自 Control 類。它充當其內部子控制元件的容器,並且沒有自己的介面。當其內部的控制元件觸發回發時,UpdatePanel 會介入以非同步啟動回發並僅更新頁面的那一部分。
例如,如果一個按鈕控制元件位於 UpdatePanel 內部並被單擊,則只有 UpdatePanel 內部的控制元件會受到影響,頁面其他部分的控制元件不會受到影響。這稱為部分回發或非同步回發。
示例
在您的應用程式中新增一個 AJAX Web 窗體。它預設包含 ScriptManager 控制元件。插入一個 UpdatePanel。在 UpdatePanel 控制元件內放置一個按鈕控制元件和一個標籤控制元件。在面板外部放置另一組按鈕和標籤。
設計檢視如下所示
原始檔如下
<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;
觀察到,當頁面執行時,如果單擊“完整回發”按鈕,它會更新兩個標籤中的時間,但如果單擊“部分回發”按鈕,它只會更新 UpdatePanel 內部的標籤。
一個頁面可以包含多個 UpdatePanel,每個面板包含其他控制元件(如網格)並顯示資料的不同部分。
當發生完整回發時,UpdatePanel 內容預設情況下會更新。可以透過更改控制元件的 UpdateMode 屬性來更改此預設模式。讓我們看看 UpdatePanel 的其他屬性。
UpdatePanel 控制元件的屬性
下表顯示了 UpdatePanel 控制元件的屬性
| 屬性 | 描述 |
|---|---|
| ChildrenAsTriggers | 此屬性指示回發是否來自子控制元件,這些子控制元件會導致 UpdatePanel 重新整理。 |
| ContentTemplate | 它是內容模板,定義了 UpdatePanel 呈現時顯示的內容。 |
| ContentTemplateContainer | 檢索動態建立的模板容器物件,並用於以程式設計方式新增子控制元件。 |
| IsInPartialRendering | 指示面板是否作為部分回發的一部分進行更新。 |
| RenderMode | 顯示渲染模式。可用的模式為 Block 和 Inline。 |
| UpdateMode | 透過確定某些條件來獲取或設定渲染模式。 |
| Triggers | 定義觸發器物件集合,每個觸發器物件對應於導致面板自動重新整理的事件。 |
UpdatePanel 控制元件的方法
下表顯示了 UpdatePanel 控制元件的方法
| 方法 | 描述 |
|---|---|
| CreateContentTemplateContainer | 建立一個 Control 物件,充當定義 UpdatePanel 控制元件內容的子控制元件的容器。 |
| CreateControlCollection | 返回 UpdatePanel 控制元件中包含的所有控制元件的集合。 |
| Initialize | 如果啟用了部分頁面呈現,則初始化 UpdatePanel 控制元件觸發器集合。 |
| Update | 導致更新 UpdatePanel 控制元件的內容。 |
UpdatePanel 的行為取決於 UpdateMode 屬性和 ChildrenAsTriggers 屬性的值。
| UpdateMode | ChildrenAsTriggers | 效果 |
|---|---|---|
| Always | False | 非法引數。 |
| Always | True | 如果整個頁面重新整理或其上的子控制元件回發,則 UpdatePanel 會重新整理。 |
| Conditional | False | 如果整個頁面重新整理或其外部的觸發控制元件啟動重新整理,則 UpdatePanel 會重新整理。 |
| Conditional | True | 如果整個頁面重新整理或其上的子控制元件回發或其外部的觸發控制元件啟動重新整理,則 UpdatePanel 會重新整理。 |
UpdateProgress 控制元件
UpdateProgress 控制元件在瀏覽器中提供了一種反饋,同時一個或多個 UpdatePanel 控制元件正在更新。例如,當用戶登入或在執行某些資料庫相關作業時等待伺服器響應。
它提供了一個視覺化的確認,例如“正在載入頁面...” ,指示工作正在進行中。
UpdateProgress 控制元件的語法為
<asp:UpdateProgress ID="UpdateProgress1" runat="server" DynamicLayout="true"
AssociatedUpdatePanelID="UpdatePanel1" >
<ProgressTemplate>
Loading...
</ProgressTemplate>
</asp:UpdateProgress>
以上程式碼段顯示了 ProgressTemplate 標記中的簡單訊息。但是,它可以是影像或其他相關控制元件。除非使用 AssociatedUpdatePanelID 屬性將其分配給單個 UpdatePanel,否則 UpdateProgress 控制元件會對每個非同步回發顯示。
UpdateProgress 控制元件的屬性
下表顯示了 UpdateProgress 控制元件的屬性
| 屬性 | 描述 |
|---|---|
| AssociatedUpdatePanelID | 獲取和設定與此控制元件關聯的 UpdatePanel 的 ID。 |
| Attributes | 獲取或設定 UpdateProgress 控制元件的層疊樣式表 (CSS) 屬性。 |
| DisplayAfter | 獲取和設定顯示進度模板之前的毫秒數。預設值為 500。 |
| DynamicLayout | 指示進度模板是否為動態呈現。 |
| ProgressTemplate | 指示在非同步回發期間顯示的模板,該回發花費的時間超過 DisplayAfter 時間。 |
UpdateProgress 控制元件的方法
下表顯示了 UpdateProgress 控制元件的方法
| 方法 | 描述 |
|---|---|
| GetScriptDescriptors | 返回 UpdateProgress 控制元件客戶端功能所需元件、行為和客戶端控制元件的列表。 |
| GetScriptReferences | 返回 UpdateProgress 控制元件的客戶端指令碼庫依賴項列表。 |
Timer 控制元件
Timer 控制元件用於自動啟動回發。這可以透過兩種方式完成
(1) 設定 UpdatePanel 控制元件的 Triggers 屬性
<Triggers> <asp:AsyncPostBackTrigger ControlID="btnpanel2" EventName="Click" /> </Triggers>
(2) 將 Timer 控制元件直接放置在 UpdatePanel 內作為子控制元件觸發器。單個 Timer 可以作為多個 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 - 資料來源
資料來源控制元件與資料繫結控制元件互動,並隱藏複雜的資料繫結過程。這些是向資料繫結控制元件提供資料並支援執行插入、刪除、排序和更新等操作的工具。
每個資料來源控制元件都封裝了一個特定的資料提供程式 - 關係資料庫、XML 文件或自定義類,並有助於
- 管理連線
- 選擇資料
- 管理分頁、快取等呈現方面。
- 操作資料
ASP.NET 中提供了許多資料來源控制元件,用於訪問來自 SQL Server、ODBC 或 OLE DB 伺服器、XML 檔案和業務物件的資料。
根據資料型別,這些控制元件可以分為兩類
- 分層資料來源控制元件
- 基於表的 資料來源控制元件
用於分層資料的 資料來源控制元件有
XMLDataSource - 它允許繫結到 XML 檔案和字串,無論是否有架構資訊。
SiteMapDataSource - 它允許繫結到提供站點地圖資訊的提供程式。
用於表格資料的 資料來源控制元件有
| 資料來源控制元件 | 描述 |
|---|---|
| SqlDataSource | 它表示與 ADO.NET 資料提供程式的連線,該提供程式返回 SQL 資料,包括可透過 OLEDB 和 ODBC 訪問的資料來源。 |
| ObjectDataSource | 它允許繫結到返回資料的自定義 .Net 業務物件。 |
| LinqdataSource | 它允許繫結到 Linq-to-SQL 查詢的結果(僅 ASP.NET 3.5 支援)。 |
| AccessDataSource | 它表示與 Microsoft Access 資料庫的連線。 |
資料來源檢視
資料來源檢視是 DataSourceView 類的物件。它代表了不同資料操作(如排序、篩選等)的自定義資料檢視。
DataSourceView 類作為所有資料來源檢視類的基類,定義了資料來源控制元件的功能。
下表提供了 DataSourceView 類的屬性
| 屬性 | 描述 |
|---|---|
| CanDelete | 指示是否允許在基礎資料來源上進行刪除操作。 |
| CanInsert | 指示是否允許在基礎資料來源上進行插入操作。 |
| CanPage | 指示是否允許在基礎資料來源上進行分頁操作。 |
| CanRetrieveTotalRowCount | 指示是否可獲得總行數資訊。 |
| CanSort | 指示資料是否可以排序。 |
| CanUpdate | 指示是否允許在基礎資料來源上進行更新操作。 |
| Events | 獲取資料來源檢視的事件處理程式委託列表。 |
| Name | 檢視的名稱。 |
下表提供了 DataSourceView 類的 方法
| 方法 | 描述 |
|---|---|
| CanExecute | 確定是否可以執行指定的命令。 |
| ExecuteCommand | 執行特定的命令。 |
| ExecuteDelete | 對 DataSourceView 物件表示的資料列表執行刪除操作。 |
| ExecuteInsert | 對 DataSourceView 物件表示的資料列表執行插入操作。 |
| ExecuteSelect | 從基礎資料儲存中獲取資料列表。 |
| ExecuteUpdate | 對 DataSourceView 物件表示的資料列表執行更新操作。 |
| Delete | 對與檢視關聯的資料執行刪除操作。 |
| Insert | 對與檢視關聯的資料執行插入操作。 |
| Select | 返回查詢到的資料。 |
| Update | 對與檢視關聯的資料執行更新操作。 |
| OnDataSourceViewChanged | 引發 DataSourceViewChanged 事件。 |
| RaiseUnsupportedCapabilitiesError | 由 RaiseUnsupportedCapabilitiesError 方法呼叫,以將 ExecuteSelect 操作請求的功能與檢視支援的功能進行比較。 |
SqlDataSource 控制元件
SqlDataSource 控制元件表示與關係資料庫(如 SQL Server 或 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 控制元件的相關屬性集,這些屬性集提供了控制元件的程式設計介面
| 屬性組 | 描述 |
|---|---|
|
DeleteCommand, DeleteParameters, DeleteCommandType |
獲取或設定用於刪除基礎資料中行的 SQL 語句、引數和型別。 |
|
FilterExpression, FilterParameters |
獲取或設定資料篩選字串和引數。 |
|
InsertCommand, InsertParameters, InsertCommandType |
獲取或設定用於在基礎資料庫中插入行的 SQL 語句、引數和型別。 |
|
SelectCommand, SelectParameters, SelectCommandType |
獲取或設定用於從基礎資料庫中檢索行的 SQL 語句、引數和型別。 |
| SortParameterName | 獲取或設定命令的儲存過程將用於對資料進行排序的輸入引數的名稱。 |
|
UpdateCommand, UpdateParameters, UpdateCommandType |
獲取或設定用於更新基礎資料儲存中行的 SQL 語句、引數和型別。 |
以下程式碼片段顯示了一個啟用資料操作的資料來源控制元件
<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>
ObjectDataSource 控制元件
ObjectDataSource 控制元件允許使用者定義的類將其方法的輸出與資料繫結控制元件關聯。此類的程式設計介面與 SqlDataSource 控制元件幾乎相同。
以下是繫結業務物件的兩個重要方面
可繫結類應該具有預設建構函式,它應該是無狀態的,並且具有可以對映到選擇、更新、插入和刪除語義的方法。
物件必須一次更新一個專案,不支援批處理操作。
讓我們直接透過一個示例來使用此控制元件。Student 類是將與物件資料來源一起使用的類。此類具有三個屬性:學生 ID、姓名和城市。它具有預設建構函式和用於檢索資料的 GetStudents 方法。
Student 類
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 窗體中放置一個物件資料來源控制元件。
透過選擇物件配置資料來源。
為對資料執行的不同操作選擇資料方法。在此示例中,只有一種方法。
在頁面上放置一個數據繫結控制元件(如 GridView),並選擇物件資料來源作為其基礎資料來源。
在此階段,設計檢視應如下所示
執行專案,它將從 Student 類中檢索硬編碼的元組。
AccessDataSource 控制元件
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 - 資料繫結
每個 ASP.NET Web 窗體控制元件都從其父 Control 類繼承 DataBind 方法,這使其具有將資料繫結到其至少一個屬性的固有能力。這稱為簡單資料繫結或內聯資料繫結。
簡單資料繫結涉及將實現 IEnumerable 介面的任何集合(專案集合)或 DataSet 和 DataTable 類附加到控制元件的 DataSource 屬性。
另一方面,某些控制元件可以透過資料來源控制元件將其記錄、列表或資料列繫結到其結構中。這些控制元件派生自 BaseDataBoundControl 類。這稱為宣告性資料繫結。
資料來源控制元件幫助資料繫結控制元件實現諸如排序、分頁和編輯資料集合等功能。
BaseDataBoundControl 是一個抽象類,它由另外兩個抽象類繼承
- DataBoundControl
- HierarchicalDataBoundControl
抽象類 DataBoundControl 又由另外兩個抽象類繼承
- ListControl
- CompositeDataBoundControl
能夠進行簡單資料繫結的控制元件派生自 ListControl 抽象類,這些控制元件是
- BulletedList
- CheckBoxList
- DropDownList
- ListBox
- RadioButtonList
能夠進行宣告性資料繫結(更復雜的資料繫結)的控制元件派生自 CompositeDataBoundControl 抽象類。這些控制元件是
- DetailsView
- FormView
- GridView
- RecordList
簡單資料繫結
簡單資料繫結涉及只讀選擇列表。這些控制元件可以繫結到陣列列表或資料庫中的欄位。選擇列表從資料庫或資料來源中獲取兩個值;一個值由列表顯示,另一個值被視為與顯示值對應的值。
讓我們透過一個小例子來理解這個概念。建立一個包含一個專案符號列表和一個 SqlDataSource 控制元件的網站。配置資料來源控制元件以從您的資料庫中檢索兩個值(我們使用與上一章相同的 DotNetReferences 表)。
為專案符號列表控制元件選擇資料來源涉及
- 選擇資料來源控制元件
- 選擇要顯示的欄位,稱為資料欄位
- 選擇值的欄位
應用程式執行後,檢查整個標題列是否繫結到專案符號列表並顯示。
宣告性資料繫結
我們已經在前面的教程中使用 GridView 控制元件使用了宣告性資料繫結。其他能夠以表格方式顯示和操作資料的複合資料繫結控制元件包括 DetailsView、FormView 和 RecordList 控制元件。
在下一個教程中,我們將研究處理資料庫的技術,即 ADO.NET。
但是,資料繫結涉及以下物件
儲存從資料庫檢索的資料的資料集。
資料提供程式,它透過使用連線上的命令從資料庫檢索資料。
資料介面卡,它發出儲存在命令物件中的 select 語句;它還能夠透過發出 Insert、Delete 和 Update 語句來更新資料庫中的資料。
資料繫結物件之間的關係
示例
讓我們採取以下步驟
步驟 (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 物件陣列。
Page_Load 事件處理程式確保建立書籍列表。該列表為 IList 型別,它實現 IEnumerable 介面,並且能夠繫結到列表控制元件。頁面載入事件處理程式將 IList 物件“bklist”與列表控制元件繫結。bookname 屬性將被顯示,而 authorname 屬性被視為值。
頁面執行時,如果使用者選擇一本圖書,則其名稱將被列表控制元件選中並顯示,而相應的標籤將顯示作者姓名,這是列表控制元件所選索引對應的值。
ASP.NET - 自定義控制元件
使用者控制元件
使用者控制元件的行為類似於微型 ASP.NET 頁面或 Web 窗體,可以被許多其他頁面使用。它們派生自 System.Web.UI.UserControl 類。這些控制元件具有以下特徵
- 它們具有 .ascx 副檔名。
- 它們可能不包含任何 <html>、<body> 或 <form> 標記。
- 它們具有 Control 指令而不是 Page 指令。
為了理解這個概念,讓我們建立一個簡單的使用者控制元件,它將充當 Web 頁面的頁尾。要建立和使用使用者控制元件,請執行以下步驟
- 建立一個新的 Web 應用程式。
- 右鍵單擊解決方案資源管理器中的專案資料夾,然後選擇“新增新項”。

從“新增新項”對話方塊中選擇“Web 使用者控制元件”,並將其命名為 footer.ascx。最初,footer.ascx 只包含一個 Control 指令。
<%@ 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" />
自定義控制元件
自定義控制元件作為單獨的程式集部署。它們被編譯成動態連結庫 (DLL),並像任何其他 ASP.NET 伺服器控制元件一樣使用。它們可以透過以下兩種方式建立
- 透過從現有控制元件派生自定義控制元件
- 透過組合兩個或多個現有控制元件來組合新的自定義控制元件。
- 透過從基控制元件類派生。
為了理解這個概念,讓我們建立一個自定義控制元件,它將簡單地在瀏覽器上呈現文字訊息。要建立此控制元件,請執行以下步驟
建立一個新的網站。右鍵單擊解決方案資源管理器中樹頂部的解決方案(而不是專案)。
在“新建專案”對話方塊中,從專案模板中選擇“ASP.NET 伺服器控制元件”。
上述步驟將新增一個新專案,併為解決方案建立一個完整的自定義控制元件,稱為 ServerControl1。在此示例中,讓我們將專案命名為 CustomControls。要使用此控制元件,必須在頁面上註冊它之前將其作為對網站的引用新增。要新增對現有專案的引用,請右鍵單擊專案(而不是解決方案),然後單擊“新增引用”。
從“新增引用”對話方塊的“專案”選項卡中選擇 CustomControls 專案。解決方案資源管理器應顯示該引用。
要在頁面上使用該控制元件,請在 @Page 指令下方新增 Register 指令
<%@ Register Assembly="CustomControls" Namespace="CustomControls" TagPrefix="ccs" %>
此外,您可以使用該控制元件,就像使用任何其他控制元件一樣。
<form id="form1" runat="server">
<div>
<ccs:ServerControl1 runat="server"
Text = "I am a Custom Server Control" />
</div>
</form>
執行後,控制元件的 Text 屬性將在瀏覽器上呈現,如下所示
使用自定義控制元件
在前面的示例中,設定了自定義控制元件的 Text 屬性的值。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}:ServerControl1 runat=server></{0}:ServerControl1 >")]
public class ServerControl1 : 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);
}
}
}
以上程式碼是為自定義控制元件自動生成的。可以向自定義控制元件類新增事件和方法。
示例
讓我們副檔名為 SeverControl1 的先前自定義控制元件。讓我們為其提供一個名為 checkpalindrome 的方法,使其能夠檢查迴文。
迴文是在反轉時拼寫相同的單詞/文字。例如,Malayalam、madam、saras 等。
擴充套件自定義控制元件的程式碼,它應如下所示
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}:ServerControl1 runat=server></{0}:ServerControl1 >")]
public class ServerControl1 : 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:ServerControl1 ID="ServerControl11" runat="server" Text = "" />
</div>
</form>
按鈕的 Click 事件處理程式只需將文字從文字框複製到自定義控制元件的 text 屬性。
protected void Button1_Click(object sender, EventArgs e)
{
this.ServerControl11.Text = this.TextBox1.Text;
}
執行後,控制元件成功檢查了迴文。
觀察以下內容
(1) 當您新增對自定義控制元件的引用時,它將新增到工具箱中,您可以像使用任何其他控制元件一樣直接從工具箱中使用它。
(2) 此處重寫了自定義控制元件類的 RenderContents 方法,因為您可以新增自己的方法和事件。
(3) RenderContents 方法採用 HtmlTextWriter 型別的引數,該引數負責在瀏覽器上呈現。
ASP.NET - 個性化
網站設計用於使用者重複訪問。個性化允許站點記住使用者身份和其他資訊詳細資訊,併為每個使用者提供個性化的環境。
ASP.NET 提供了用於個性化網站以適應特定客戶的品味和偏好的服務。
瞭解配置檔案
ASP.NET 個性化服務基於使用者配置檔案。使用者配置檔案定義站點所需的使用者相關資訊型別。例如,姓名、年齡、地址、出生日期和電話號碼。
此資訊在應用程式的 web.config 檔案中定義,ASP.NET 執行時讀取並使用它。此工作由個性化提供程式完成。
從使用者資料獲得的使用者配置檔案儲存在 ASP.NET 建立的預設資料庫中。您可以建立自己的資料庫來儲存配置檔案。配置檔案定義儲存在配置檔案 web.config 中。
示例
讓我們建立一個示例站點,我們希望我們的應用程式記住使用者的詳細資訊,如姓名、地址、出生日期等。在 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_load 以顯示配置檔案資訊
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;
}
}
}
}
編寫以下 Submit 按鈕的處理程式,以將使用者資料儲存到配置檔案中
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();
}
}
首次執行頁面時,使用者需要輸入資訊。但是,下次使用者詳細資訊將自動載入。
<add> 元素的屬性
除了我們已使用的 name 和 type 屬性外,<add> 元素還有其他屬性。下表說明了其中一些屬性
| Attributes | 描述 |
|---|---|
| name | 屬性的名稱。 |
| type | 預設情況下,型別為字串,但它允許任何完全限定的類名稱作為資料型別。 |
| serializeAs | 序列化此值時使用的格式。 |
| readOnly | 只讀配置檔案值無法更改,預設情況下此屬性為 false。 |
| defaultValue | 如果配置檔案不存在或沒有資訊,則使用預設值。 |
| allowAnonymous | 一個布林值,指示此屬性是否可以與匿名配置檔案一起使用。 |
| Provider | 應用於管理此屬性的配置檔案提供程式。 |
匿名個性化
匿名個性化允許使用者在識別自身身份之前個性化網站。例如,Amazon.com 允許使用者在登入前將商品新增到購物車中。為了啟用此功能,可以將 web.config 檔案配置為以下格式:
<anonymousIdentification enabled ="true" cookieName=".ASPXANONYMOUSUSER" cookieTimeout="120000" cookiePath="/" cookieRequiresSSL="false" cookieSlidingExpiration="true" cookieprotection="Encryption" coolieless="UseDeviceProfile"/>
ASP.NET - 錯誤處理
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);
}
}
}
跟蹤
要啟用頁面級跟蹤,您需要修改 Page 指令並新增 Trace 屬性,如下所示:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="errorhandling._Default" Trace ="true" %>
現在,當您執行檔案時,將獲得跟蹤資訊。
它在頂部提供了以下資訊:
- 會話 ID
- 狀態程式碼
- 請求時間
- 請求型別
- 請求和響應編碼
每次請求頁面時,伺服器傳送的狀態程式碼都會顯示錯誤名稱和時間(如果有)。下表顯示了常見的 HTTP 狀態程式碼:
| 編號 | 描述 |
|---|---|
| 資訊性 (100 - 199) | |
| 100 | 繼續 |
| 101 | 切換協議 |
| 成功 (200 - 299) | |
| 200 | 確定 |
| 204 | 無內容 |
| 重定向 (300 - 399) | |
| 301 | 永久移動 |
| 305 | 使用代理 |
| 307 | 臨時重定向 |
| 客戶端錯誤 (400 - 499) | |
| 400 | 錯誤請求 |
| 402 | 需要付款 |
| 404 | 未找到 |
| 408 | 請求超時 |
| 417 | 期望失敗 |
| 伺服器錯誤 (500 - 599) | |
| 500 | 內部伺服器錯誤 |
| 503 | 服務不可用 |
| 505 | 不支援的 HTTP 版本 |
在頂級資訊下方,是跟蹤日誌,它提供了頁面生命週期的詳細資訊。它提供了自頁面初始化以來以秒為單位的經過時間。
下一部分是控制元件樹,它以分層方式列出頁面上的所有控制元件。
最後是會話和應用程式狀態摘要、cookie 和標頭集合,以及所有伺服器變數的列表。
Trace 物件允許您向跟蹤輸出新增自定義資訊。它有兩個方法可以實現此目的:Write 方法和 Warn 方法。
修改 Page_Load 事件處理程式以檢查 Write 方法。
protected void Page_Load(object sender, EventArgs e)
{
Trace.Write("Page Load");
if (!IsPostBack)
{
Trace.Write("Not Post Back, Page Load");
string[,] quotes =
.......................
}
}
執行以觀察效果。
要檢查 Warn 方法,讓我們在 SelectedIndexChanged 事件處理程式中強制輸入一些錯誤程式碼。
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>
錯誤處理
儘管 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> 部分具有以下可能的屬性:
Mode:啟用或停用自定義錯誤頁面。它有三個可能的值:
- On:顯示自定義頁面。
- Off:顯示 ASP.NET 錯誤頁面(黃色頁面)。
- remoteOnly:向客戶端顯示自定義錯誤,在本地顯示 ASP.NET 錯誤。
defaultRedirect:包含在發生未處理錯誤時要顯示的頁面的 URL。
要為不同型別的錯誤設定不同的自定義錯誤頁面,可以使用 <error> 子標記,其中根據錯誤的狀態程式碼指定不同的錯誤頁面。
要實現頁面級錯誤處理,可以修改 Page 指令:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="errorhandling._Default" Trace ="true" ErrorPage="PageError.htm" %>
由於 ASP.NET 除錯本身就是一個重要的主題,因此我們將在下一章中單獨討論它。
ASP.NET - 除錯
除錯允許開發人員以逐步的方式檢視程式碼的工作方式,變數的值如何變化,物件如何建立和銷燬等。
首次執行站點時,Visual Studio 會顯示一個提示,詢問是否應啟用除錯。
啟用除錯後,web.config 中將顯示以下程式碼行:
<system.web>
<compilation debug="true">
<assemblies>
..............
</assemblies>
</compilation>
</system.web>
除錯工具欄提供了所有可用於除錯的工具。
斷點
斷點指定在執行時執行特定程式碼行,然後停止執行,以便可以檢查程式碼並執行各種除錯工作,例如更改變數的值、單步執行程式碼、進出函式和方法等。
要設定斷點,請右鍵單擊程式碼並選擇“插入斷點”。左側邊距上會出現一個紅點,並且程式碼行將突出顯示,如下所示:
接下來,當您執行程式碼時,您可以觀察其行為。
在此階段,您可以單步執行程式碼,觀察執行流程並檢查變數、屬性、物件等的值。
您可以從透過右鍵單擊斷點符號獲得的“屬性”選單中修改斷點的屬性。
“位置”對話方塊顯示檔案的路徑、行號和所選程式碼的字元號。“條件”選單項允許您輸入一個有效的表示式,該表示式在程式執行到達斷點時進行計算。
“命中次數”選單項顯示一個對話方塊,其中顯示斷點已執行的次數。
單擊下拉列表中顯示的任何選項都會開啟一個編輯欄位,在其中輸入目標命中次數。這在分析程式碼中的迴圈結構時特別有用。
“篩選器”選單項允許設定篩選器以指定機器、程序、執行緒或任何組合,斷點將對此有效。
“命中時”選單項允許您指定在命中斷點時要執行的操作。
除錯視窗
Visual Studio 提供以下除錯視窗,每個視窗都顯示一些程式資訊。下表列出了這些視窗:
| 視窗 | 描述 |
|---|---|
| 立即 | 顯示變數和表示式。 |
| 自動 | 顯示當前和先前語句中的所有變數。 |
| 區域性變數 | 顯示當前上下文中的所有變數。 |
| 監視 | 顯示多達四組不同的變數。 |
| 呼叫堆疊 | 顯示呼叫堆疊中的所有方法。 |
| 執行緒 | 顯示和控制執行緒。 |
ASP.NET - LINQ
大多數應用程式都是以資料為中心的,但是大多數資料儲存庫都是關係資料庫。多年來,設計人員和開發人員一直在基於物件模型設計應用程式。
物件負責連線到資料訪問元件 - 稱為資料訪問層 (DAL)。這裡我們需要考慮三個要點:
應用程式中所需的所有資料都不儲存在同一個源中。源可以是關係資料庫、一些業務物件、XML 檔案或 Web 服務。
訪問記憶體中物件比訪問資料庫或 XML 檔案中的資料更簡單且成本更低。
訪問的資料不會直接使用,而是需要進行排序、整理、分組、更改等。
因此,如果有一個工具可以簡化所有型別的資料訪問,允許從這些不同的資料來源連線資料並執行標準資料處理操作,只需幾行程式碼即可,那將非常有幫助。
LINQ 或語言整合查詢就是這樣一種工具。LINQ 是對 .Net Framework 3.5 及其託管語言的一組擴充套件,它將查詢設定為一個物件。它定義了一種通用語法和程式設計模型,可以使用通用語言查詢不同型別的資料。
Select、Project、Join、Group、Partition、Set 等關係運算符在 LINQ 中實現,並且 .Net framework 3.5 中支援 LINQ 語法的 C# 和 VB 編譯器使無需藉助 ADO.NET 即可使用配置的資料儲存成為可能。
例如,使用 C# 中的 LINQ 查詢查詢 Northwind 資料庫中的 Customers 表,程式碼將如下所示:
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 查詢返回標題。
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 運算子
除了迄今為止使用的運算子之外,還有其他幾個運算子,它們實現了所有查詢子句。讓我們看看一些運算子和子句。
Join 子句
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_Load 事件處理程式中新增程式碼,以使用 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);
}
結果頁面如下所示:
Where 子句
“where 子句”允許向查詢新增一些條件過濾器。例如,如果您想檢視頁面數超過 500 的書籍,請將 Page_Load 事件處理程式更改為:
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 和 Orderbydescending 子句
這些子句允許對查詢結果進行排序。要查詢書籍的標題、頁數和價格,並按價格排序,請在 Page_Load 事件處理程式中編寫以下程式碼:
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};
返回的元組如下所示:
Let 子句
let 子句允許定義一個變數併為其分配從資料值計算出的值。例如,要計算上述兩個銷售額的總銷售額,您需要計算:
TotalSale = Price of the Book * Sales
要實現此目的,請在 Page_Load 事件處理程式中新增以下程式碼段:
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 - 安全性
在站點中實現安全性包含以下方面:
身份驗證:它是確保使用者身份和真實性的過程。ASP.NET 允許四種類型的身份驗證:
- Windows 身份驗證
- 表單身份驗證
- Passport 身份驗證
- 自定義身份驗證
授權:它是定義和分配特定角色給特定使用者的過程。
機密性:它涉及對客戶端瀏覽器和 Web 伺服器之間的通道進行加密。
完整性:它涉及維護資料的完整性。例如,實施數字簽名。
基於表單的身份驗證
傳統上,基於表單的身份驗證涉及編輯 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 允許您透過網站管理工具輕鬆實現使用者建立、身份驗證和授權,而無需編寫任何程式碼。此工具允許建立使用者和角色。
除此之外,ASP.NET 還附帶現成的登入控制元件集,其中包含為您執行所有工作的控制元件。
實現基於表單的安全
要設定基於表單的身份驗證,您需要以下內容
- 支援身份驗證過程的使用者資料庫
- 使用該資料庫的網站
- 使用者帳戶
- 角色
- 限制使用者和組活動
- 預設頁面,用於顯示使用者的登入狀態和其他資訊。
- 登入頁面,允許使用者登入、檢索密碼或更改密碼
要建立使用者,請執行以下步驟
步驟 (1):選擇“網站”->“ASP.NET 配置”以開啟 Web 應用程式管理工具。
步驟 (2):單擊“安全”選項卡。
步驟 (3):透過選擇“來自 Internet”單選按鈕,將身份驗證型別選擇為“基於表單的身份驗證”。
步驟 (4):單擊“建立使用者”連結以建立一些使用者。如果您已經建立了角色,則可以在此階段將角色分配給使用者。
步驟 (5):建立網站並新增以下頁面
- Welcome.aspx
- Login.aspx
- CreateAccount.aspx
- PasswordRecovery.aspx
- ChangePassword.aspx
步驟 (6):從工具箱的登入部分將 LoginStatus 控制元件放置在 Welcome.aspx 上。它有兩個模板:LoggedIn 和 LoggedOut。
在 LoggedOut 模板中,有一個登入連結;在 LoggedIn 模板中,控制元件上有一個登出連結。您可以從“屬性”視窗更改控制元件的登入和登出文字屬性。
步驟 (7):將 LoginView 控制元件從工具箱放置在 LoginStatus 控制元件下方。在這裡,您可以放置文字和其他控制元件(超連結、按鈕等),這些控制元件根據使用者是否登入而顯示。
此控制元件有兩個檢視模板:匿名模板和 LoggedIn 模板。選擇每個檢視併為使用者編寫一些文字,以便為每個模板顯示。文字應放置在標有紅色的區域。
步驟 (8):應用程式的使用者由開發人員建立。您可能希望允許訪問者建立使用者帳戶。為此,請在 LoginView 控制元件下方新增一個連結,該連結應連結到 CreateAccount.aspx 頁面。
步驟 (9):在建立帳戶頁面上放置一個 CreateUserWizard 控制元件。將此控制元件的 ContinueDestinationPageUrl 屬性設定為 Welcome.aspx。
步驟 (10):建立登入頁面。在頁面上放置一個 Login 控制元件。LoginStatus 控制元件自動連結到 Login.aspx。要更改此預設設定,請在 web.config 檔案中進行以下更改。
例如,如果要將登入頁面命名為 signup.aspx,請將以下行新增到 web.config 的 <authentication> 部分
<configuration>
<system.web>
<authentication mode="Forms">
<forms loginUrl ="signup.aspx" defaultUrl = “Welcome.aspx†/>
</authentication>
</system.web>
</configuration>
步驟 (11):使用者經常忘記密碼。PasswordRecovery 控制元件幫助使用者訪問帳戶。選擇 Login 控制元件。開啟其智慧標記並單擊“轉換為模板”。
自定義控制元件的 UI,以在登入按鈕下方放置一個超連結控制元件,該控制元件應連結到 PassWordRecovery.aspx。
步驟 (12):在密碼恢復頁面上放置一個 PasswordRecovery 控制元件。此控制元件需要一個電子郵件伺服器才能將密碼傳送給使用者。
步驟 (13):在 Welcome.aspx 中的 LoginView 控制元件的 LoggedIn 模板中建立到 ChangePassword.aspx 頁面的連結。
步驟 (14):在更改密碼頁面上放置一個 ChangePassword 控制元件。此控制元件也有兩個檢視。
現在執行應用程式並觀察不同的安全操作。
要建立角色,請返回到 Web 應用程式管理工具並單擊“安全”選項卡。單擊“建立角色”併為應用程式建立一些角色。
單擊“管理使用者”連結並將角色分配給使用者。
IIS 身份驗證:SSL
安全套接字層或 SSL 用於確保安全連線的協議。啟用 SSL 後,瀏覽器會加密傳送到伺服器的所有資料並解密來自伺服器的所有資料。同時,伺服器會加密和解密到瀏覽器和來自瀏覽器的所有資料。
安全連線的 URL 以 HTTPS 開頭,而不是 HTTP。使用安全連線的瀏覽器會顯示一個小鎖。當瀏覽器首次嘗試使用 SSL 透過安全連線與伺服器通訊時,伺服器會透過傳送其數字證書來對其自身進行身份驗證。
要使用 SSL,您需要從受信任的證書頒發機構 (CA) 購買數字安全證書並將其安裝在 Web 伺服器中。以下是一些受信任和信譽良好的證書頒發機構
- www.verisign.com
- www.geotrust.com
- www.thawte.com
SSL 內置於所有主要的瀏覽器和伺服器中。要啟用 SSL,您需要安裝數字證書。各種數字證書的強度根據加密期間生成的金鑰長度而異。金鑰長度越長,證書越安全,因此連線越安全。
| 強度 | 描述 |
|---|---|
| 40 位 | 大多數瀏覽器都支援,但容易破解。 |
| 56 位 | 比 40 位更強大。 |
| 128 位 | 極其難以破解,但並非所有瀏覽器都支援它。 |
ASP.NET - 資料快取
什麼是快取?
快取是一種將常用資料/資訊儲存在記憶體中的技術,以便下次需要相同資料/資訊時,可以直接從記憶體中檢索,而不是由應用程式生成。
快取對於提高 ASP.NET 中的效能至關重要,因為頁面和控制元件在此處是動態生成的。對於與資料相關的交易尤其重要,因為這些交易在響應時間方面成本很高。
快取將常用資料放置在易於訪問的介質中,例如計算機的隨機存取記憶體。ASP.NET 執行時包含一個名為快取的 CLR 物件的關鍵值對映。它駐留在應用程式中,可以透過 HttpContext 和 System.Web.UI.Page 訪問。
在某種程度上,快取類似於儲存狀態物件。但是,在狀態物件中儲存資訊是確定性的,即您可以依靠儲存在那裡的資料,而資料的快取是非確定性的。
在以下情況下資料將不可用
- 如果其生命週期過期,
- 如果應用程式釋放其記憶體,
- 如果由於某種原因未進行快取。
您可以使用索引器訪問快取中的專案,並且可以控制快取中物件的生存期並設定快取物件與其物理源之間的連結。
ASP.Net 中的快取
ASP.NET 提供以下不同型別的快取
輸出快取:輸出快取儲存傳送到客戶端的最終呈現的 HTML 頁面或頁面部分的副本。當下一個客戶端請求此頁面時,系統會發送頁面的快取副本,而不是重新生成頁面,從而節省時間。
資料快取:資料快取意味著快取來自資料來源的資料。只要快取未過期,對資料的請求都將從快取中滿足。當快取過期時,將從資料來源獲取新鮮資料,並重新填充快取。
物件快取:物件快取是在頁面上快取物件,例如資料繫結控制元件。快取的資料儲存在伺服器記憶體中。
類快取:Web 頁面或 Web 服務在首次執行時編譯到程式集中的頁面類中。然後將程式集快取在伺服器中。下次當對頁面或服務發出請求時,會引用快取的程式集。當原始碼更改時,CLR 會重新編譯程式集。
配置快取:應用程式範圍的配置資訊儲存在配置檔案中。配置快取將配置資訊儲存在伺服器記憶體中。
在本教程中,我們將考慮輸出快取、資料快取和物件快取。
輸出快取
呈現頁面可能涉及一些複雜的過程,例如資料庫訪問、呈現複雜控制元件等。輸出快取允許透過將資料快取在記憶體中來繞過往返伺服器。甚至可以快取整個頁面。
OutputCache 指令負責輸出快取。它啟用輸出快取並提供對其行為的某些控制。
OutputCache 指令的語法
<%@ OutputCache Duration="15" VaryByParam="None" %>
將此指令放在頁面指令下。這告訴環境將頁面快取 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 秒。但是,下次重新整理頁面時,它不需要任何時間,因為頁面是從快取中檢索的,而無需載入。
OutputCache 指令具有以下屬性,有助於控制輸出快取的行為
| 屬性 | Values | 描述 |
|---|---|---|
| DiskCacheable | true/false | 指定輸出可以寫入基於磁碟的快取。 |
| NoStore | true/false | 指定是否傳送“no store”快取控制標頭。 |
| CacheProfile | 字串名稱 | 要儲存在 web.config 中的快取配置檔案的名稱。 |
| VaryByParam |
None * 引數名稱 |
以分號分隔的字串列表指定 GET 請求中的查詢字串值或 POST 請求中的變數。 |
| VaryByHeader |
* 標頭名稱 |
以分號分隔的字串列表指定客戶端可能提交的標頭。 |
| VaryByCustom |
Browser 自定義字串 |
告訴 ASP.NET 根據瀏覽器名稱和版本或自定義字串來改變輸出快取。 |
| 位置 |
任何 客戶端 下游 Server None |
任何:頁面可以快取在任何位置。 客戶端:快取內容保留在瀏覽器中。 下游:快取內容儲存在下游和伺服器中。 伺服器:快取內容僅儲存在伺服器上。 無:停用快取。 |
| 持續時間 | 編號 | 頁面或控制元件快取的秒數。 |
讓我們在前面的示例中新增一個文字框和一個按鈕,併為該按鈕新增此事件處理程式。
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 會根據文字框中的名稱快取頁面。
資料快取
資料快取的主要方面是快取資料來源控制元件。我們已經討論過資料來源控制元件如何在資料來源(如資料庫或 XML 檔案)中表示資料。這些控制元件派生自抽象類 DataSourceControl,並具有以下用於實現快取的繼承屬性
CacheDuration - 它設定資料來源快取資料的秒數。
CacheExpirationPolicy - 它定義快取過期時快取的行為。
CacheKeyDependency - 它標識控制元件的關鍵,當刪除該控制元件時,該控制元件會自動使快取的內容過期。
EnableCaching - 它指定是否快取資料。
示例
為了演示資料快取,建立一個新的網站並在其上新增一個新的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>
物件快取
物件快取比其他快取技術提供了更大的靈活性。您可以使用物件快取將任何物件放入快取中。物件可以是任何型別 - 資料型別、Web控制元件、類、資料集物件等。只需分配一個新的鍵名即可將專案新增到快取中,如下所示
Cache["key"] = item;
ASP.NET還提供Insert()方法用於將物件插入快取。此方法有四個過載版本。讓我們看看它們
| 過載 | 描述 |
|---|---|
| Cache.Insert((key, value); | 使用鍵名和值將專案插入快取,並使用預設優先順序和過期時間。 |
| Cache.Insert(key, value, dependencies); | 使用鍵、值、預設優先順序、過期時間和一個CacheDependency名稱將專案插入快取,該名稱連結到其他檔案或專案,以便當這些檔案或專案更改時,快取專案不再有效。 |
| Cache.Insert(key, value, dependencies, absoluteExpiration, slidingExpiration); | 這指示了過期策略以及上述問題。 |
| Cache.Insert(key, value, dependencies, absoluteExpiration, slidingExpiration, priority, onRemoveCallback); | 除了引數之外,這還允許您為快取專案設定優先順序,以及一個委託,該委託指向一個在移除專案時要呼叫的方法。 |
滑動過期用於在專案未在指定時間段內使用時將其從快取中移除。以下程式碼片段儲存了一個具有10分鐘滑動過期時間的專案,並且沒有依賴項。
Cache.Insert("my_item", obj, null, DateTime.MaxValue, TimeSpan.FromMinutes(10));
示例
建立一個只有按鈕和標籤的頁面。在頁面載入事件中編寫以下程式碼
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秒內再次單擊該按鈕,頁面將回發,但標籤控制元件會從快取中獲取其資訊,如下所示
Page Posted Back. Retrieving test item. Test item is: 14-07-2010 01:25:04
ASP.NET - Web 服務
Web服務是基於Web的功能,它使用Web協議進行訪問,以便Web應用程式使用。Web服務開發有三個方面
- 建立Web服務
- 建立代理
- 使用Web服務
建立Web服務
Web服務是一個Web應用程式,它基本上是一個包含可供其他應用程式使用的某些方法的類。它也遵循程式碼隱藏架構,例如ASP.NET網頁,儘管它沒有使用者介面。
為了理解這個概念,讓我們建立一個Web服務來提供股票價格資訊。客戶端可以根據股票程式碼查詢股票的名稱和價格。為了使本例保持簡單,值在二維陣列中硬編碼。此Web服務有三種方法
- 預設的HelloWorld方法
- GetName方法
- GetPrice方法
按照以下步驟建立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方法,提供一個硬編碼的股票程式碼之一,它將返回股票的名稱
使用Web服務
為了使用Web服務,在同一個解決方案下建立一個網站。這可以透過在解決方案資源管理器中右鍵單擊解決方案名稱來完成。呼叫Web服務的網頁應有一個標籤控制元件來顯示返回的結果,以及兩個按鈕控制元件,一個用於回發,另一個用於呼叫服務。
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());
}
}
}
建立代理
代理是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 - 多執行緒
執行緒被定義為程式的執行路徑。每個執行緒都定義了一個唯一的控制流。如果您的應用程式涉及複雜且耗時的操作,例如資料庫訪問或一些密集的I/O操作,那麼設定不同的執行路徑或執行緒通常很有幫助,每個執行緒執行一項特定工作。
執行緒是輕量級程序。執行緒的一個常見用例是現代作業系統併發程式設計的實現。使用執行緒可以節省CPU週期浪費,提高應用程式效率。
到目前為止,我們編譯的程式中只有一個執行緒作為單個程序執行,該程序是應用程式的執行例項。但是,這樣應用程式一次只能執行一項工作。為了使其能夠一次執行多個任務,可以將其劃分為更小的執行緒。
在.Net中,執行緒透過“System.Threading”名稱空間進行處理。建立System.Threading.Thread型別的變數允許您建立一個新的執行緒來開始工作。它允許您在程式中建立和訪問單個執行緒。
建立執行緒
透過建立一個Thread物件並向其建構函式提供一個ThreadStart引用來建立執行緒。
ThreadStart childthreat = new ThreadStart(childthreadcall);
執行緒生命週期
執行緒的生命週期從建立System.Threading.Thread類的物件時開始,並在執行緒終止或完成執行時結束。
以下是執行緒生命週期中的各種狀態
未啟動狀態:這是建立執行緒例項但未呼叫Start方法的情況。
就緒狀態:這是執行緒已準備好執行並等待CPU週期的狀態。
不可執行狀態:執行緒不可執行,當
- 已呼叫Sleep方法
- 已呼叫Wait方法
- 被I/O操作阻塞
死亡狀態:這是執行緒已完成執行或已被中止的情況。
執行緒優先順序
Thread類的Priority屬性指定了一個執行緒相對於其他執行緒的優先順序。.Net執行時選擇具有最高優先順序的就緒執行緒。
優先順序可以歸類為
- 高於正常
- 低於正常
- 最高
- 最低
- 正常
建立執行緒後,可以使用執行緒類的Priority屬性設定其優先順序。
NewThread.Priority = ThreadPriority.Highest;
執行緒屬性和方法
Thread類具有以下重要屬性
| 屬性 | 描述 |
|---|---|
| CurrentContext | 獲取執行緒正在執行的當前上下文。 |
| CurrentCulture | 獲取或設定當前執行緒的區域性。 |
| CurrentPrinciple | 獲取或設定執行緒的當前主體以進行基於角色的安全。 |
| CurrentThread | 獲取當前正在執行的執行緒。 |
| CurrentUICulture | 獲取或設定ResourceManager在執行時查詢特定於區域性的資源時使用的當前區域性。 |
| ExecutionContext | 獲取一個ExecutionContext物件,該物件包含有關當前執行緒的各種上下文的資訊。 |
| IsAlive | 獲取一個值,指示當前執行緒的執行狀態。 |
| IsBackground | 獲取或設定一個值,指示執行緒是否為後臺執行緒。 |
| IsThreadPoolThread | 獲取一個值,指示執行緒是否屬於託管執行緒池。 |
| ManagedThreadId | 獲取當前託管執行緒的唯一識別符號。 |
| Name | 獲取或設定執行緒的名稱。 |
| Priority | 獲取或設定一個值,指示執行緒的排程優先順序。 |
| ThreadState | 獲取一個包含當前執行緒狀態的值。 |
Thread類具有以下重要方法
| 方法 | 描述 |
|---|---|
| Abort | 在呼叫它的執行緒上引發ThreadAbortException,以開始終止執行緒的過程。呼叫此方法通常會終止執行緒。 |
| AllocateDataSlot | 在所有執行緒上分配一個未命名的資料插槽。為了獲得更好的效能,請改用標記有ThreadStaticAttribute屬性的欄位。 |
| AllocateNamedDataSlot | 在所有執行緒上分配一個命名的資料插槽。為了獲得更好的效能,請改用標記有ThreadStaticAttribute屬性的欄位。 |
| BeginCriticalRegion | 通知主機,執行即將進入一段程式碼區域,在此區域中,執行緒中止或未處理異常的影響可能會危及應用程式域中的其他任務。 |
| BeginThreadAffinity | 通知主機,託管程式碼即將執行依賴於當前物理作業系統執行緒標識的指令。 |
| EndCriticalRegion | 通知主機,執行即將進入一段程式碼區域,在此區域中,執行緒中止或未處理異常的影響僅限於當前任務。 |
| EndThreadAffinity | 通知主機,託管程式碼已完成執行依賴於當前物理作業系統執行緒標識的指令。 |
| FreeNamedDataSlot | 消除名稱和插槽之間的關聯,適用於程序中的所有執行緒。為了獲得更好的效能,請改用標記有 ThreadStaticAttribute 屬性的欄位。 |
| GetData | 檢索當前執行緒當前域中指定插槽的值。為了獲得更好的效能,請改用標記有 ThreadStaticAttribute 屬性的欄位。 |
| GetDomain | 返回當前執行緒正在執行的應用程式域。 |
| GetDomainID | 返回唯一的應用程式域識別符號。 |
| GetNamedDataSlot | 查詢命名資料插槽。為了獲得更好的效能,請改用標記有 ThreadStaticAttribute 屬性的欄位。 |
| Interrupt | 中斷處於 WaitSleepJoin 執行緒狀態的執行緒。 |
| Join | 阻塞呼叫執行緒,直到執行緒終止,同時繼續執行標準 COM 和 SendMessage 訊息迴圈。此方法具有不同的過載形式。 |
| MemoryBarrier | 同步記憶體訪問,如下所示:執行當前執行緒的處理器不能以這樣的方式重新排序指令,即在呼叫 MemoryBarrier 之前進行的記憶體訪問在呼叫 MemoryBarrier 之後進行的記憶體訪問之後執行。 |
| ResetAbort | 取消對當前執行緒請求的中斷。 |
| SetData | 為當前執行執行緒的當前域設定指定插槽中的資料。為了獲得更好的效能,請改用標記有 ThreadStaticAttribute 屬性的欄位。 |
| Start | 啟動一個執行緒。 |
| Sleep | 使執行緒暫停一段時間。 |
| SpinWait | 導致執行緒等待由 iterations 引數定義的次數。 |
| VolatileRead() | 讀取欄位的值。該值是計算機中任何處理器最新寫入的值,無論處理器的數量或處理器快取的狀態如何。此方法具有不同的過載形式。 |
| VolatileWrite() | 立即將值寫入欄位,以便計算機中的所有處理器都可以看到該值。此方法具有不同的過載形式。 |
| Yield | 導致呼叫執行緒將執行權讓給另一個已準備好線上程當前處理器上執行的執行緒。作業系統選擇要讓出的執行緒。 |
示例
以下示例說明了 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";
}
}
}
}
觀察以下內容
載入頁面時,將使用 childthreadcall() 方法的引用啟動一個新執行緒。主執行緒活動將直接顯示在網頁上。
第二個執行緒執行並將訊息傳送到標籤控制元件。
主執行緒休眠 2000 毫秒,在此期間子執行緒執行。
子執行緒執行直到被主執行緒中止。它引發 ThreadAbortException 並終止。
控制權返回到主執行緒。
執行程式時,會發送以下訊息
ASP.NET - 配置
ASP.NET 應用程式的行為受配置檔案中不同設定的影響
- machine.config
- web.config
machine.config 檔案包含所有受支援設定的預設值和特定於機器的值。機器設定由系統管理員控制,應用程式通常無法訪問此檔案。
但是,應用程式可以透過在其根資料夾中建立 web.config 檔案來覆蓋預設值。web.config 檔案是 machine.config 檔案的子集。
如果應用程式包含子目錄,則可以為每個資料夾定義一個 web.config 檔案。每個配置檔案的作用域以分層自上而下的方式確定。
任何 web.config 檔案都可以在本地擴充套件、限制或覆蓋上層定義的任何設定。
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>
配置節處理程式宣告
配置節處理程式包含在 <configSections> 標記內。每個配置處理程式指定檔案中包含的配置節的名稱,該節提供一些配置資料。它具有以下基本語法
<configSections> <section /> <sectionGroup /> <remove /> <clear/> </configSections>
它具有以下元素
Clear - 它刪除對繼承的節和節組的所有引用。
Remove - 它刪除對繼承的節和節組的引用。
Section - 它定義配置節處理程式和配置元素之間的關聯。
Section group - 它定義配置節處理程式和配置節之間的關聯。
應用程式設定
應用程式設定允許儲存應用程式範圍的名稱-值對,以便進行只讀訪問。例如,您可以將自定義應用程式設定定義為
<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>
連線字串
連線字串顯示網站可用的資料庫連線字串。例如
<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 元素
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|None]"> <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|None" 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 - 部署
ASP.NET 部署有兩類
本地部署:在這種情況下,整個應用程式都包含在一個虛擬目錄中,所有內容和程式集都包含在其中,並且可供應用程式使用。
全域性部署:在這種情況下,程式集可供伺服器上執行的每個應用程式使用。
有多種用於部署的技術,但是,我們將討論以下最常見和最簡單的部署方法
- XCOPY 部署
- 複製網站
- 建立安裝專案
XCOPY 部署
XCOPY 部署意味著將所有檔案的遞迴副本複製到目標計算機上的目標資料夾。您可以使用任何常用的技術
- FTP 傳輸
- 使用提供遠端站點複製的伺服器管理工具
- MSI 安裝程式應用程式
XCOPY 部署只需將應用程式檔案複製到生產伺服器並在此處設定虛擬目錄。您需要使用 Internet 資訊管理器 Microsoft 管理控制檯 (MMC 管理單元) 設定虛擬目錄。
複製網站
“複製網站”選項在 Visual Studio 中可用。它位於“網站”->“複製網站”選單選項中。此選單項允許將當前網站複製到另一個本地或遠端位置。這是一種整合 FTP 工具。
使用此選項,您可以連線到目標目的地,選擇所需的複製模式
- 覆蓋
- 源到目標檔案
- 同步源和目標專案
然後繼續物理複製檔案。與 XCOPY 部署不同,此部署過程是從 Visual Studio 環境中完成的。但是,上述兩種部署方法都存在以下問題
- 您傳遞了原始碼。
- 沒有檔案的預編譯和相關錯誤檢查。
- 初始頁面載入速度會很慢。
建立安裝專案
在此方法中,您使用 Windows Installer 並打包您的 Web 應用程式,以便它可以隨時部署到生產伺服器。Visual Studio 允許您構建部署包。讓我們在一個現有的專案(例如資料繫結專案)上測試一下。
開啟專案並執行以下步驟
步驟 (1):在解決方案資源管理器中突出顯示網站根目錄,然後選擇“檔案”->“新增”->“新建專案”。
步驟 (2):在“其他專案型別”下選擇“安裝和部署”。選擇“安裝嚮導”。
步驟 (3):選擇預設位置可確保安裝專案位於網站根目錄下的其自身資料夾中。單擊“確定”以獲取嚮導的第一個啟動螢幕。
步驟 (4):選擇專案型別。選擇“為 Web 應用程式建立安裝程式”。
步驟 (5):接下來,第三個螢幕要求從解決方案中的所有專案中選擇專案輸出。選中“來自...”旁邊的複選框。
步驟 (6):第四個螢幕允許包含其他檔案,如自述檔案。但是,在我們的案例中沒有這樣的檔案。單擊“完成”。
步驟 (7):最後一個螢幕顯示安裝專案設定的摘要。
步驟 (8):安裝專案新增到解決方案資源管理器,主設計視窗顯示檔案系統編輯器。
步驟 (9):下一步是構建安裝專案。右鍵單擊解決方案資源管理器中的專案名稱,然後選擇“生成”。
步驟 (10):生成完成後,您將在輸出視窗中收到以下訊息
構建過程會建立兩個檔案
- Setup.exe
- Setup-databinding.msi
您需要將這些檔案複製到伺服器。雙擊安裝檔案,即可在本地計算機上安裝 .msi 檔案的內容。