開篇概述
對於任何一個初學者來說,頁面之間傳值可謂是必經之路,卻又是他們的痛點。其實,對大部分高手來說,未必不是痛點。
回想2016年面試的將近300人中,有實習生,有應屆畢業生,有1-3年經驗的,有3-5年經驗的,有5-10年經驗的,對於所有的面試者,我幾乎問了同一道題:"請說說你所知道的頁面之間傳值的幾種形式和方法,並闡述他們的原理和過程",關於這道題,從大家的回答來看,結果並不是很理想,從種類上來說,大部分人回答5種左右,極少部分能回答8種,沒有超過8種的,但從深度上來說,很少有人能透徹的分析每種方法的原理和過程,(當然,要想透徹的分析這些原理和過程,需要研究底層的東西,如page 生命週期和page原理,反射,IIS如何解析請求等,CLR,GC,反編譯等)。
大致概括一下,ASP.NET 頁面之間傳遞值得方式大致可以分為如下幾種:Request.QueryString["name"],Request.Form("name"),Session,Cookie,Cache,Application,Server.Transfer,Database,HttpContext的Item屬性,Files,DataBase等等。
詳解每種方法
一、Request.QueryString
核心代碼:
protected void getQueryString_Click(object sender, EventArgs e) { string QueStr = Request.QueryString["name"]; Response.Write(QueStr); }
總結:
1、Request.QueryString:擷取http查詢字串變數集合。有兩重載,即Request.QueryString[string name]和Request.QueryString[int index];
2、Request.QueryString主要是擷取url中的“?”之後的參數,如url:a.aspx?name="queryString",則Request.QueryString["name"]的值為“queryString”。
二、Request.Form
核心代碼:
protected void getQueryString_Click(object sender, EventArgs e) { string strQueForm = Request.Form["TextBox1"]; Response.Write(strQueForm); }
總結:
1、Request.Form 擷取表單變數集合。有兩重載,即Request.Form[string name]和Requst.Form[int index]。
2、擷取表單指定名字的參數值。
三、Session
1、Session基本操作
a、建立Session
//建立Session public void createSession(string[] arrStr) { //建立數組 string[] str=new string[arrStr.Length]; for (int i = 0; i < arrStr.Length; i++) { str[i] = i.ToString(); Session[str[i]] = arrStr[i]; } }
b、擷取Session的值
string getSessionValue=Session["name"].ToString();
c、遍曆Session
//遍曆Session public void getSession() { IEnumerator sessionEnum = Session.Keys.GetEnumerator(); while (sessionEnum.MoveNext()) { Response.Write(Session[sessionEnum.Current.ToString()].ToString()+";"); } }
d、清空Session,但不結束會話
//清空Session,但不結束會話 public void clearSession() { Session.Clear(); }
e、結束Session會話
//結束Session會話 public void abandonSession() { Session.Abandon(); }
2、Session資料存放形式和位置
<system.web> <sessionState mode="Off|InProc|StateServer|SQLServer" cookieless="true|false" timeout="number of minutes" stateConnectionString="tcpip=server:port" sqlConnectionString="sql connection string" stateNetworkTimeout="number of seconds"/></system.web>
註解:
mode:表示設定儲存Session形式和位置;
a、Off:禁用Session;
b、Inproc:In Process縮寫,表示將Session儲存在IIS進程內,但注意,該種方式雖然效能高,但IIS重啟是,丟失Session資訊;(預設值)
c、SateServer:將Session儲存在ASP.NET狀態服務進程中(重新啟動Web運用程式時保留工作階段狀態,並使工作階段狀態可以用於網路中的多個Web伺服器);
d、將Session儲存在SQL Server中
cookieless:設定用戶端儲存Session形式和位置
a、true:使用cookieless模式,這時用戶端的Session資訊就不再使用Cookie儲存了,而是將其通過URL儲存;
b、false:使用kookie模式,預設值。
timeout 設定經過多少分鐘後伺服器自動放棄Session資訊。預設為20分鐘;
stateConnectionString 設定將Session資訊儲存在狀態服務中時使用的伺服器名稱和連接埠號碼,例如:"tcpip=127.0.0.1:42424”。當mode的值是StateServer是,這個屬性是必需的。(預設連接埠42424);
sqlConnectionString 設定與SQL Server串連時的連接字串。例如"data source=localhost;Integrated Security=SSPI;Initial Catalog=joye"。當mode的值是SQLServer時,這個屬性是必需的;
stateNetworkTimeout 設定當使用StateServer模式儲存Session狀態時,經過多少秒空閑後,斷開Web伺服器與儲存狀態資訊的伺服器的TCP/IP串連的。預設值是10秒鐘;
3、Session原理
為什麼引入Session?大家知道,因為http是一種無狀態協議,因此,Session正彌補了這一缺陷。當然,Session作用遠遠不止於這些,這裡就不多論述。
Session在ASP.NET中,表示用戶端(Goggle,Firefox,IE等)與伺服器端的會話,用來儲存特定會話資訊,準確來說,是用來儲存特定使用者資訊。當用戶端向伺服器發送一個請求時,如登陸使用者ID,伺服器接收到該請求,伺服器端Session產生一個與該登陸使用者相關的SessionID,並將SessioID返回給用戶端(Goggle,Firefox,IE等),在新會話開始時,伺服器將SessionID當做cookie儲存在使用者的瀏覽器中。
總結:
1、定義:System.Web.SessionState.HttpSessionState Page.Session //擷取ASP.NET提供的當前Session對象。
2、特性:
a、Session中文意思為“會話”,在ASP.NET中,表示用戶端和伺服器之間的會話,web中常用會話之一。
b、Session儲存在伺服器端記憶體中。
c、Session可以儲存任何類型的資料,包括自訂對象。
d、Session與Session間是相互獨立的,互不干擾。
e、Session與Cookie配對使用,Session在伺服器端產生SessionID,並將該SessionID返回給用戶端(IE,FireFox,Google等),用戶端Cookie來儲存該SessionID,整過會話過程中,只要儲存SessionID的Cookie不丟失,則Session的資訊就不會丟失。
f、Session儲存的資料可以跨頁訪問,即跨頁面是全域的。
g、Session不能跨進程訪問,只能由該會話使用者訪問。
h、可以在不結束會話的條件下,清除Session資訊,即調用Session.Clear();
i、當會話結束,到期,伺服器就會清除Session對象。
j、Session常用於儲存登入使用者的ID.
四、Application
核心代碼:
(1)a.aspx
private void Button1_Click(object sender, System.EventArgs e){ Application["name"] = Label1.Text;}
(2)b.aspx
private void Page_Load(object sender, EventArgs e){ string name; Application.Lock(); name = Application["name"].ToString(); Application.UnLock();}
總結:
1、Application對象的作用範圍是整個全域,也就是說對所有使用者都有效。它在整個應用程式生命週期中都是有效,類似於使用全域變數一樣,所以可以在不同頁面中對它進行存取。它和Session變數的區別在於,前者是所有的使用者共用的全域變數,後者是各個使用者專屬的全域變數。可能有人會問,既然所有使用者都可以使用application變數,那他可以用在什麼場合呢?這裡舉個例子:網站訪問數。多個請求訪問時都可以對它進行操作。
2、優點:使用簡單,消耗較少的伺服器資源;不僅能傳遞簡單資料,還能傳遞對象;資料量大小是不限制的。
3、缺點:作為全域變數容易被誤操作。所以單個使用者使用的變數一般不能用application。
4、在源頁面的代碼中建立你需要傳遞的名稱和值構造Application變數:Application["name"]="Value(Or Object)";在目的頁面的代碼使用Application變數取出傳遞的值。Result = Application["name"]。
5、常用lock和unlock方法用來鎖定和解鎖,為了防止並發修改。
五、Cache
核心代碼:
//Class1 Cache["id"] = TextBox1.Text; Response.Redirect("~/WebForm1.aspx"); //Class2 if (Cache["id"]!=null) { Label1.Text = Cache["id"].ToString(); } //移除緩衝Cache.Remove("id"); //如果 Cache["id"]為空白,則傳值失敗。可使用如下方法實//限期為10分鐘 Cache.Insert("id",TextBox1.Text,null,Cache.NoAbsoluteExpiration,new TimeSpan(0,10,0));
總結:
1、應用程式中的緩衝機制用於將需要大量伺服器資源來建立的Object Storage Service在記憶體中,以此大大改進應用程式的效能。這個機制同樣可以用來傳值。
2、與其他方法不同的是,該方法需要設定快取項目優先順序和緩衝時間。因為當系統記憶體缺乏時,緩衝機制會自動移除很少使用或優先順序較低的項,從而造成傳值失敗。
3、該方法的優點是傳遞資料的大小和數量無限制,速度快。缺點是緩衝機制的操作相對比較複雜。
六、Cookie
核心代碼:
//Class1 HttpCookie httpCookie = new HttpCookie("testCookie","Page transfers by Cookie");Response.Redirect("~/Class2.aspx");//Class2 Label1.Text = Request.Cookies["testCookie"].Value;
總結:
1、Cookie用於在使用者瀏覽器上儲存小塊的資訊,儲存使用者的相關資訊,比如使用者訪問某網站時使用者的ID,使用者的偏好等,使用者下次訪問就可以通過檢索獲得以前的資訊。所以Cookie也可以在頁面間傳遞值。
2、Cookie通過HTTP頭在瀏覽器和伺服器之間來回傳遞的。Cookie只能包含字串的值,如果想在Cookie儲存整數值,那麼需要先轉換為字串的形式。
3、與Session一樣,其是什對每一個使用者而言的,但是有個本質的區別,即Cookie是存放在用戶端的,而session是存放在伺服器端的。而且Cookie的使用要配合ASP.NET內建對象Request來使用。
4、使用簡單,是保持使用者狀態的一種非常常用的方法。比如在購物網站中使用者跨多個頁面表單時可以用它來保持使用者狀態。
5、常常被人認為用來收集使用者隱私而遭到批評。
6、安全性不高,容易偽造。
七、Context.Items["id"]
核心代碼:
//Class1 Context.Items["id"]=TextBox1.Text; Server.Transfer("~/Class2.aspx"); //Class2 Label1.Text=Context.Items["id"].ToString(); Context.Items.Remove("id"); //移除項
1、Context 對象包含與當前頁面相關的資訊,提供對整個內容相關的訪問,包括請求、響應、以及上文中的Session 和Application 等資訊。
2、可以使用此對象在網頁之間共用資訊,從而實現頁面間的傳值。
3、與使用 Form 的方法類似,該方法也能保持大量的資料,缺點也相同,但使用方法相對比較簡單。
八、ViewState
核心代碼:
//Class1ViewState["id"]=TextBox1.Text; //資料儲存Label1.Text=ViewState["id"].ToString(); //資料取出ViewState.Remove("id"); //資料移除
總結:
1、ViewState 是ASP.NET 用來在同一頁面的多個請求之間儲存和還原伺服器控制項檢視狀態的一種機制。與傳統的“同一頁面”不同,ASP.NET 中“同一頁面”的每一個請求都會導致伺服器重建該頁面,但是新產生的頁面並不包含原來頁面的資料。(頁面無狀態性)
2、ViewState 的任務就是儲存原來頁面中伺服器控制項檢視狀態的資料供新頁面使用。從這個意義上講,ViewState 也可以看作是一種在頁面間傳遞資料的工具。
3、ViewState 的工作原理是:作為一個隱藏的表單欄位在用戶端和伺服器之間傳遞,可見,濫用ViewState 會加重頁面回傳的負擔,從而降低應用程式的效能。
此外,ViewState 也能被控制項、頁面和應用程式禁用。
九、web.config和machine.config
核心代碼:
//Class1using System.Web.Configuration;WebConfigurationManager.AppSettings.Set("userName",TextBox1.Text);Response.Redirect("~/Class2.aspx");//Class2using System.Web.Configuration;Label1.Text = WebConfigurationManager.AppSettings["userName"];
總結:
1、每個Web運用程式繼承web.config檔案和machine.config檔案的設定。
2、web.config和machine.config這兩種檔案儲存資料一般都很小,多為明文,特別適合儲存一些字串常量,如資料庫連接資訊。此外,web.config檔案是可以擴充的,因此,也可以用來傳遞變數。由於這兩種檔案會被自動緩衝,所以不存在因磁碟IO產生的效能瓶頸等問題。要注意的是檔案中某些設定會導致檔案被修改後Web運用程式的重啟。
3、web.config:你可以向單個Web運用程式運用設定。例如,你可能會希望設定特定的驗證方法、調試的類型、預設語言或自訂的錯誤頁面。但如果你要使用這些設定,必須把web.config檔案放到web運用程式的根虛擬目錄下。要想在Web運用程式中進一步配置自己的子目錄,需要 在這些檔案夾中放置附加的web.config。(關於ASP.NET web.config檔案詳細介紹,可參考我另外一篇部落格:ASP.NET web.config)
4、machine.config:從c:\Windows\Microsoft.NET\Framework\Framework\[Version]\Config目錄中的一個叫macine.config的檔案開始 配置。machine.config檔案定義支援的設定檔節,配置ASP.NET工作者進程,註冊可用於進階特性(如設定檔、成員資格以及基於角色的安全等)提供者。(關於ASP.NET machine.config檔案的詳細介紹,我之後會寫一篇文章來介紹)
十、Static
核心代碼:
//class1public static string userName;//在class1中定義靜態全域變數userName=txtBoxUserName.Text;Response.Redirect("~/class2.aspx");//class2Label1.Text=Src.id;
總結:
1、這個應該是非常容易理解的,在ASP.NET中,每個頁面對應一個具體的類,既然如此,那麼頁面之間的傳遞,我們就可以歸結為:類與類之間資料的傳遞。想到這一步,問題應該就迎刃而解了, 因為我們可以利用類之間的公關靜態變數來解決這個問題。
2、若合理利用,可以有效地提高資料傳遞效率,但若濫用,可能會導致使用者或頁面間資料紊亂,存在一定風險和隱患,應謹慎使用。
提出以下問題:大家可以分析一下,以下代碼有什麼問題?
//Class1 protected void btnRedirect_Click(object sender, EventArgs e) { string userName = txtBoxUserName.Text; Response.Redirect("~/Class2.aspx"); } //Class2 Lable1.Text=userName;
十一、補充常用頁面之間跳轉
1.最常用的頁面跳轉(原視窗被替代):Response.Redirect("XXX.aspx");
2.利用url地址開啟本地網頁或互連網:Respose.Write("<script language='javascript'>window.open('"+ url+"');</script>");
3.原視窗保留再新開啟另一個頁面(瀏覽器可能阻止,需要解除):Response.Write("<script>window.open('XXX.aspx','_blank')</script>");
4.效果同1中的另一種寫法:Response.Write("<script>window.location='XXX.aspx'</script>");
5.也是原視窗被替代的 (常用於傳遞session變數的頁面跳轉):Server.Transfer("XXX.aspx");
6.原視窗保留,以對話方塊形式開啟新視窗:Response.Write("<script>window.showModelessDialog('XXX.aspx')</script>");
7.對話方塊形式開啟新視窗,原視窗被代替:Response.Write("<script>window.showModelDialog('XXX.aspx')</script>");
8.開啟簡潔視窗:Respose.Write("<script language='javascript'>window.open('"+url+"','','resizable=1,scrollbars=0,status=1,menubar=no,toolbar=no,location=no, menu=no');</script>");
9.利用vs2008連接埠:System.Diagnostics.Process.Start(http://localhost:3210/系統管理員.aspx);
注釋:比較簡單,我這裡就不論述了。
總結:
關於頁面之間傳值,還有很多方法,如檔案傳值、資料庫傳值,ViewBag等等,在這裡就不一一論述了。若以後有時間,將會在此基礎上補充,並逐步完善該篇博文。
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援topic.alibabacloud.com。