WebForm框架
WebForm是微軟推出的一款爲了吸引更多的其他開發者能夠快速入門到.NET技術中的一個框架,讓開發人員感覺使用.NET技術進行BS開發和使用.NET技術進行CS開發一樣簡單快速。
微軟的想法:以後程序員開發網站項目不需要先學習HTML+CSS就能夠直接入門BS,因此將HTML標籤封裝成類似於Winfrom中的控件,然後程序員可以在開發BS項目時使用類似於開發CS項目一樣使用“拖控件”的方式快速解決界面問題
但是這個發展途徑對於現實開發非常雞肋,導致只要項目稍微複雜,程序的執行效率很低,目前爲止微軟自己也逐漸放棄這個框架。
WebForm介紹
-
WebForm窗體的後綴名.aspx
-
WebForm的組成
-
.aspx文件類似於Winform中的設計界面
-
.aspx.cs文件類似於Winform中的後臺C#類
-
.aspx.designer.cs文件類似於Winform中的designer.cs文件
-
-
Web程序中的配置文件默認名爲:Web.config文件
CS程序中的配置文件默認名爲:App.config文件
WebForm窗體框架
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="index.aspx.cs" Inherits="ASP.NETWebDemo.index" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
</div>
</form>
</body>
</html>
@page指令:每個aspx頁面只能有一個@page指令,@page指令是關聯後臺的CS文件
html標籤:指的是這個aspx頁面的設計區域類似於普通的HTML文件,只不過這些標籤中多了一個屬性runat="server"。
標籤原本應該運行在客戶端瀏覽器中,而帶有這個屬性的標籤全都是運行在服務器上的標籤。
微軟重點就是使用這個屬性將HTML標籤轉成服務器標籤
Webform中自動攜帶一個form表單,並且這個form表單的runat屬性已經被默認設置,而且form表單中嵌套了一個div標籤,其目的就是希望我們設計頁面時將所有的標籤全部在這個form表單中去設計,這樣當這個表單在服務器中運行時,其內部的所有標籤也會在服務器中運行
事件驅動開發簡單應用
使用Web窗體和使用Winform窗體開發方式非常相似
使用“控件+事件”方式實現計算器
拖出來的控件不是普通的HTML標籤,而是< asp:>標籤,這些標籤理解爲是微軟封裝好的標籤,這些標籤是在服務器端執行的標籤,而不是發送給瀏覽器客戶端的標籤
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="num1" runat="server"></asp:TextBox>
+<asp:TextBox ID="num2" runat="server"></asp:TextBox>
=<asp:TextBox ID="num3" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="計算" />
</div>
</form>
</body>
</html>
經過對比:在瀏覽器的頁面中顯示的標籤依然是普通的html標籤,可以理解爲微軟內部將HTML標籤封裝稱爲控件標籤
在客戶端中多了一些input標籤,而且類型是“hidden”,這些hidden是隱藏域,
隱藏域的作用:
-
幫助表單收集和發送信息,便於後端處理數據。用戶點擊提交的時候,隱藏域的內容也一併提交給後臺,但是用戶是不可見的。
-
安全性:後端接收前端發來的數據,要對其身份進行確認,防止外來數據傳入後端。通過驗證value的值和後端數據庫中name的值是否一致,來達到驗證的效果。
-
對錶單中的按鈕添加隱藏域,告訴後端提交的是哪一個按鈕。
-
對於網頁中有多個表單元素form來說,多個form表單是無法一次提交的,但是表單之間又相互影響,所有通過添加隱藏域來連接表單。
-
隱藏數據:JS不支持全局變量,DNA有時候我們必須使用全局變量,就可以把值先隱藏在隱藏域中,這樣值就不會丟失了。
-
對小窗口的彈出與關閉,在IE中不支持小窗口的相互調用,所以只能在其窗口中寫一個哪個有,當小窗口可能到隱藏域的時候就會close。
ASP.NET程序開發過程
-
創建網站/Web應用程序--打開開發環境
-
編寫頁面---設計HTML頁面
-
編寫後臺---使用C#或VB.NET編寫後臺交互代碼
-
調用執行---編譯代碼併發布
ASP.NET開發中網站和Web應用程序的比較
相同點:
-
兩者都可以開發Web項目
-
兩者基於事件機制編寫程序
不同點:
-
Web應用程序在運行階段不允許修改後臺代碼,網站在運行時可以隨時修改後臺代碼,前臺刷洗即可
-
Web應用程序命名空間管理方便,而網站項目命名空間不好區分
一般開發大型項目都使用Web應用程序,目前VS中已經沒有網站項目框架了
網頁生成過程的分析
-
客戶端點擊提交按鈕或者觸發控件的事件
-
服務器端刷新整個頁面
-
執行Page_Load事件
-
執行具體控件的事件並給頁面控件賦值
-
重新生成新頁面的HTML
-
使用Response對象返回包含新數據的html頁面
-
瀏覽器看到刷新的頁面
案例
創建一個WebForm頁面,需求:頁面中實現一個聊天的對話框,當點擊按鈕將txtBox1中的內容複製到txtBox2中。
public partial class WebDemo1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
txtBox1.Text = "請輸入內容";
}
protected void btnRecive_Click(object sender, EventArgs e)
{
txtBox2.Text = txtBox1.Text;
}
}
然而執行效果並非如此
從執行過程中發現,只要頁面中訪問的服務器文件還是當前頁面那麼,每次都會從這個頁面的Page_Load事件開始,也可以理解爲,Web項目中的文件每次都是新的開始。原因是因爲代碼是服務器代碼和CS中的完全不一樣。
服務器中的文件:因爲不確定到底是哪個客戶端進行訪問的所以將每次訪問都當做第一次訪問,因此每次的訪問都是從Load事件開始。
因此服務器纔不管你這個請求到底是第一次打開連接的請求,還是點擊頁面中按鈕發送過來的請求,服務器都會給你從Load事件開始。
解決方案:
要是能夠搞清楚到底這次請求是通過URL地址第一次請求,還是點擊頁面中的請求按鈕觸發的請求就能解決
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)//首次加載IsPostBack爲false
{
txtBox1.Text = "請輸入內容";
}
else//這是回發
{
//這裏書寫回發時處理的工作
}
}
ASP.NET內置對象
Request對象
用來獲取客戶端在請求一個頁面或傳送一個Form是提供的所有信息。它包括用戶的HTTP變量、能夠識別的瀏覽器、存儲客戶端的Cookie信息和請求地址等。
Request對象是System.Web.httpRequest類的對象
屬性
-
QueryString :獲取HTTP查詢字符串變量集合,主要用於收集HTTP協議中Get請求發送的數據
-
Form :獲取窗體或頁面變量的集合,用於收集Post方法發送的請求數據
-
ServerVarible:環境變量集合包含了服務器和客戶端的系統內信息
-
Params:它是QueryString、Form和ServerVarible這三種方式的集合,不區分是由哪種方式傳遞的參數
-
ApplicationPath:獲取服務器上ASP.NET虛擬應用程序的根目錄路徑
-
ContertLength:指定客戶端發送的內容長度
-
Cookies:獲取客戶端發送的Cookie集合
-
FilePath:獲取當前請求的虛擬路徑
-
Files:獲取採用多部分MIME格式的由客戶端上載的文件集合
-
Item:從Cookies, From, QueryString或ServerVariables集合中獲取指定的對象
-
Path:獲取當前請求的虛擬路徑
-
Url:獲取有關當前請求的URL信息
-
UserHostName:獲取遠程客戶端的DNS名稱
-
UserHostAddress:獲取遠程客戶端的IP主機地址
-
IsLocal:獲取一個值,該值指示該請求是否來自本地計算機
-
Browser:獲取或設置有關正在請求的客戶端瀏覽器功能信息
方法
-
BinaryRead():執行對當前輸入流進行制定字節數的二進制讀取
-
SaveAs():將HTTP請求保存到磁盤
-
MapPath():將指定的路徑映射到物理路徑
Response對象
Response對象是HttpRespone類的一個實例。該類主要是封裝來自ASP.NET操作的HTTP相應信息。Response對象將數據作爲請求的結果從服務器發送到客戶瀏覽器中,並提供有關響應的消息。它可用來在頁面中輸出數據,在頁面中跳轉,還可以傳遞各個頁面的參數。
方法
-
Redirect:將網頁重新轉到另一地址
-
Write:寫出指定字符串。
-
AppendHeader:
語法格式 Response.AppendHeader(Name,Value) 參數Name爲HTTP頭,參數Value爲HTTP頭的值。
HTTP頭是HTTP協議規定的請求和響應消息都支持的頭域內容。HTTP頭是頁面通過HTTP協議訪問頁面時,最先響應的請求和響應消息,例如HTTP頭中的Location,Location頭用於將頁面重定向到另一個頁面,與Redirect方法相似。
-
WriteFile 將文件輸出到客戶端
-
Flush 將緩衝區的數據輸出到客戶端瀏覽器
-
End 停止並結束ASP網頁的處理
-
Close 關閉客戶端的聯機
-
ClearHeaders 清除緩衝區中的頁面標題
-
Clear 清除緩衝區的數據
-
BinaryWrite 將二進制字符或字符串輸出到客戶端瀏覽器
-
AppendToLog 將自定義的數據加入到IIS日誌文件中(Log File),以便追蹤與分析記錄。
屬性
-
ContentType:輸出流的內容類型比如html(text/html) 、普通文本(text/pain)還是JPEG圖片(image/JPEG)。
-
ContentEncoding:輸出流的編碼
-
Cookies : 返回瀏覽器的cookies的集合
-
Buffer : 設置緩衝信息, true | false .默認是true
-
Expires : 獲取或設置在瀏覽器上緩存的頁過期之前的分鐘數, 設置爲0,則立刻過期
Page對象
每個aspx文件對應的一個page對象,.aspx頁面與後臺.cs代碼類(局部類)合併生成頁面類,Page對象是頁面類的實例。所有的.aspx文件(Web窗體頁)都繼承自System.Web.UI.Page類
<%@ Page
Language="C#" ---指明後臺使用C#語言
AutoEventWireup="true" ---設置是否自動調用網頁Load事件,默認是true
CodeBehind="WebDemo1.aspx.cs"---其.aspx文件上綁定的後臺代碼文件
Inherits="ASP.NETDemo.Demo1.WebDemo1" ---後臺代碼類
%>
屬性
-
IsPostBack:該屬性可以檢查.aspx頁是否爲傳遞迴服務器的頁面,常用於判斷頁面是否爲首次加載。
如果爲true則爲回發響應,如果爲false則爲首次加載
-
IsValid:該屬性用於判斷頁面中的所有輸入的內容是否應經通過驗證,它是一個布爾值的屬性。當需要使用服務器端驗證時,可以使用該屬性。
-
IsCrossPagePostBack:該屬性判斷頁面是否使用跨頁提交,它是一個布爾值的屬性。
-
Response屬性和Request屬性上面講過了
事件
Page類常用的事件及執行的先後順序:
-
Page.PreInit 事件:在頁初始化開始時發生
-
Page.Init 事件:當服務器控件初始化時發生;初始化是控件生存期的第一步。 (繼承自 Control。)
-
Page.InitComplite事件:在頁初始化完成時發生
-
Page.PreLoad事件:在頁 Load 事件之前發生
-
Page.Load事件:當服務器控件加載到 Page 對象中時發生。 (繼承自 Control )
-
Page.LoadComplete 事件:在頁生命週期的加載階段結束時發生
-
Page.PreRender事件 :在加載 Control 對象之後、呈現之前發生。 (繼承自 Control。)
-
Page.PreRenderComplete 事件:在呈現頁內容之前發生
ViewState對象
視圖狀態,在 ASP .NET 中,當一個表單被提交時,表單會連同表單值一起出現在瀏覽器窗口中。如何做到的呢?這是因爲 ASP .NET 維持了您的 ViewState。 ViewState 會在頁面被提交到服務器時表明它的狀態。這個狀態是通過在帶有 < form runat="server"> 控件的每個頁面上放置一個隱藏域定義的。
這個對象是ASP.NET中特有的對象,在其他語言的後端技術中沒有這個對象
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)//如果是第一次訪問
{
//先將Count的值設爲0,並且保存在ViewState中
ViewState["count"] = 0;
}
}
protected void btnAdd_Click(object sender, EventArgs e)
{
//每次點擊按鈕先取出ViewState中的值並且累加之後再次賦給ViewState
ViewState["count"] = Convert.ToInt32(ViewState["count"]) + 1;
Literal1.Text = ViewState["count"].ToString();
}
}
使用ViewState實現頁面信息的保存
保存數據:ViewState對象存儲數據[鍵值對]Key=Value
取出數據:根據Key值取出Value值
總結:
-
ViewState中保存的數據全部被轉換成object類型,取出時務必強制轉換成特定類型
-
ViewState只能在同一個頁面的連續多次請求之間保存信息,頁面跳轉後信息就會丟失
ViewState的本質
ViewState的本質是一個隱藏域,和原始的.aspx文件中的多出來的標籤一樣,都是一個隱藏域,第一次創建ViewState對象其實是創建了一個隱藏域
服務器的特性
無狀態特性
-
Web服務器不會保留每次瀏覽器所發出的HTTP請求的具體信息和當時的狀態
-
即使請求來自於同一個瀏覽器,他也將其視爲“陌生人”,絕不會“記得瀏覽器”在剛纔做了些什麼
-
在ASP.NET後臺中,不再有“成員變量”,理解爲每次的請求對於服務器而言都是一次新生,返回的是一個新對象
-
ASP.NET中專門提供了一個網頁多次請求之間保存信息的對象"ViewState"(視圖狀態)對象來模擬“成員變量”的角色
問號傳值
可以利用類似於get請求的方式將數據傳送到服務器,然後由服務器將數據再轉交給目標頁面。這種傳值方式只適合傳遞一些不是很重要的數據,不會影響整個網站的主要流程