【ASP.NET MVC系列】淺談ASP.NET 頁面之間傳值的幾種方式

ASP.NET MVC系列文章javascript

【01】淺談Google Chrome瀏覽器(理論篇)html

【02】淺談Google Chrome瀏覽器(操做篇)(上)java

【03】淺談Google Chrome瀏覽器(操做篇)(下)web

【04】淺談ASP.NET框架   面試

【05】淺談ASP.NET MVC運行過程    sql

【06】淺談ASP.NET MVC 控制器   數據庫

【07】淺談ASP.NET MVC 路由   數組

【08】淺談ASP.NET MVC 視圖 瀏覽器

【09】淺談ASP.NET MVC 視圖與控制器傳遞數據緩存

【10】淺談jqGrid 在ASP.NET MVC中增刪改查     

【11】淺談ASP.NET 頁面之間傳值的幾種方式

【12】淺談緩存技術在ASP.NET中的運用       

【13】淺談NuGet在VS中的運用      

【14】淺談ASP.NET 程序發佈過程           

【15】淺談數據註解和驗證           

【16】淺談依賴注入

【17】淺談表單和HTML輔助方法

【18】淺談基於APS.NET身份驗證

【19】淺談ASP.NET MVC 模型

【20】淺談ASP.NET MVC 單元測試

【21】淺談ASP.NET MVC網絡安全;

【22】淺談ASP.NET MVC八大類擴展

【23】再談ASP.NET MVC Routing

【24】淺談ASP.NET 高級話題

【25】淺談大型ASP.NET MVC項目(含DEMO)

【26】下一系列:ASP.NET WebAPI


 

開篇概述

對於任何一個初學者來講,頁面之間傳值可謂是必經之路,卻又是他們的難點。其實,對大部分高手來講,未必不是難點。

回想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等等。

 

詳解每種方法

 

1、Request.QueryString


核心代碼:

protected void getQueryString_Click(object sender, EventArgs e)
 {
      string QueStr = Request.QueryString["name"];
      Response.Write(QueStr);
 }

總結:

一、Request.QueryString:獲取http查詢字符串變量集合。有兩重載,即Request.QueryString[string name]和Request.QueryString[int index];

二、Request.QueryString主要是獲取url中的「?」以後的參數,如url:a.aspx?name="queryString",則Request.QueryString["name"]的值爲「queryString」。

 

2、Request.Form


 核心代碼:

protected void getQueryString_Click(object sender, EventArgs e)
  {
      string strQueForm = Request.Form["TextBox1"];
      Response.Write(strQueForm);
  }

總結:

一、Request.Form 獲取窗體變量集合。有兩重載,即Request.Form[string name]和Requst.Form[int index]。

二、獲取表單指定名字的參數值。

 

3、Session


一、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();
        }

二、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秒鐘;

三、Session原理

      爲何引入Session?你們知道,由於http是一種無狀態協議,所以,Session正彌補了這一缺陷。固然,Session做用遠遠不止於這些,這裏就很少論述。

      Session在ASP.NET中,表示客戶端(Goggle,Firefox,IE等)與服務器端的會話,用來存儲特定會話信息,準確來講,是用來存儲特定用戶信息。當客戶端向服務器發送一個請求時,如登錄用戶ID,服務器接收到該請求,服務器端Session產生一個與該登錄用戶相關的SessionID,並將SessioID返回給客戶端(Goggle,Firefox,IE等),在新會話開始時,服務器將SessionID當作cookie存儲在用戶的瀏覽器中。

總結:

一、定義:System.Web.SessionState.HttpSessionState  Page.Session //獲取ASP.NET提供的當前Session對象。

二、特性:

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.

 

4、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(); 
}

 總結:

一、Application對象的做用範圍是整個全局,也就是說對全部用戶都有效。它在整個應用程序生命週期中都是有效的,相似於使用全局變量同樣,因此能夠在不一樣頁面中

對它進行存取。它和Session變量的區別在於,前者是全部的用戶共用的全局變量,後者是各個用戶獨有的全局變量。可能有人會問,既然全部用戶均可以使用application

變量,那他能夠用在什麼場合呢?這裏舉個例子:網站訪問數。多個請求訪問時均可以對它進行操做。

二、優勢:使用簡單,消耗較少的服務器資源;不只能傳遞簡單數據,還能傳遞對象;數據量大小是不限制的。

三、缺點:做爲全局變量容易被誤操做。因此單個用戶使用的變量通常不能用application。

四、在源頁面的代碼中建立你須要傳遞的名稱和值構造Application變量:Application["name"]="Value(Or Object)";在目的頁面的代碼使用Application變量取出傳遞的值。Result = Application["name"]。

五、經常使用lock和unlock方法用來鎖定和解鎖,爲了防止併發修改。

 

5、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));

總結:

一、應用程序中的緩存機制用於將須要大量服務器資源來建立的對象存儲在內存中,以此大大改進應用程序的性能。這個機制一樣能夠用來傳值。

二、與其餘方法不一樣的是,該方法須要設置緩存項優先級和緩存時間。由於當系統內存缺少時,緩存機制會自動移除不多使用或優先級較低的項,從而形成傳值失敗。

三、該方法的優勢是傳遞數據的大小和數量無限制,速度快。缺點是緩存機制的操做相對比較複雜。

 

6、Cookie


 核心代碼:

//Class1

HttpCookie httpCookie = new HttpCookie("testCookie","Page transfers by Cookie");
Response.Redirect("~/Class2.aspx");
//Class2

Label1.Text = Request.Cookies["testCookie"].Value;

 總結:

一、Cookie用於在用戶瀏覽器上存儲小塊的信息,保存用戶的相關信息,好比用戶訪問某網站時用戶的ID,用戶的偏好等,用戶下次訪問就能夠經過檢索

得到之前的信息。因此Cookie也能夠在頁面間傳遞值。

二、Cookie經過HTTP頭在瀏覽器和服務器之間來回傳遞的。Cookie只能包含字符串的值,若是想在Cookie存儲整數值,那麼須要先轉換爲字符串的形式。

三、與Session同樣,其是什對每個用戶而言的,可是有個本質的區別,即Cookie是存放在客戶端的,而session是存放在服務器端的。並且Cookie的使

用要配合ASP.NET內置對象Request來使用。

四、使用簡單,是保持用戶狀態的一種很是經常使用的方法。好比在購物網站中用戶跨多個頁面表單時能夠用它來保持用戶狀態。

五、經常被人認爲用來收集用戶隱私而遭到批評。

六、安全性不高,容易僞造。 

 

7、Context.Items["id"]


核心代碼:

//Class1

 Context.Items["id"]=TextBox1.Text;
 Server.Transfer("~/Class2.aspx");
//Class2 Label1.Text=Context.Items["id"].ToString(); Context.Items.Remove("id"); //移除項

一、Context 對象包含與當前頁面相關的信息,提供對整個上下文的訪問,包括請求、響應、以及上文中的Session 和Application 等信息。

二、可使用此對象在網頁之間共享信息,從而實現頁面間的傳值。

三、與使用 Form 的方法相似,該方法也能保持大量的數據,缺點也相同,但使用方法相對比較簡單。

 

8、ViewState


核心代碼:

//Class1
ViewState["id"]=TextBox1.Text; //數據保存
Label1.Text=ViewState["id"].ToString(); //數據取出
ViewState.Remove("id"); //數據移除

總結:

一、ViewState 是ASP.NET 用來在同一頁面的多個請求之間保存和還原服務器控件視圖狀態的一種機制。與傳統的「同一頁面」不一樣,ASP.NET 中「同一頁面」的

每個請求都會致使服務器從新生成該頁面,可是新生成的頁面並不包含原來頁面的數據。(頁面無狀態性)

二、ViewState 的任務就是保存原來頁面中服務器控件視圖狀態的數據供新頁面使用。從這個意義上講,ViewState 也能夠看做是一種在頁面間傳遞數據的工具。

三、ViewState 的工做原理是:做爲一個隱藏的窗體字段在客戶端和服務器之間傳遞,可見,濫用ViewState 會加劇頁面回傳的負擔,從而下降應用程序的性能。

此外,ViewState 也能被控件、頁面和應用程序禁用。

 

9、web.config和machine.config


核心代碼:

//Class1
using System.Web.Configuration;
WebConfigurationManager.AppSettings.Set("userName",TextBox1.Text);
Response.Redirect("~/Class2.aspx");
//Class2
using System.Web.Configuration;
Label1.Text = WebConfigurationManager.AppSettings["userName"];

總結:

一、每一個Web運用程序繼承web.config文件和machine.config文件的設置。

二、web.config和machine.config這兩種文件保存數據通常都很小,多爲明文,特別適合保存一些字符串常量,如數據庫鏈接信息。此外,web.config文件是能夠

擴展的,所以,也能夠用來傳遞變量。因爲這兩種文件會被自動緩存,因此不存在因磁盤IO產生的性能瓶頸等問題。要注意的是文件中某些設置會致使文件被修改後

Web運用程序的重啓。

三、web.config:你能夠向單個Web運用程序運用設置。例如,你可能會但願設置特定的驗證方法、調試的類型、默認語言或自定義的錯誤頁面。但若是你要使用這些

設置,必須把web.config文件放到web運用程序的根虛擬目錄下。要想在Web運用程序中進一步配置本身的子目錄,須要 在這些文件夾中放置附加的web.config。

(關於ASP.NET web.config文件詳細介紹,可參考我另一篇博客:ASP.NET web.config)

四、machine.config:從c:\Windows\Microsoft.NET\Framework\Framework\[Version]\Config目錄中的一個叫macine.config的文件開始 配置。machine.config

文件定義支持的配置文件節,配置ASP.NET工做者進程,註冊可用於高級特性(如配置文件、成員資格以及基於角色的安全等)提供程序。(關於ASP.NET machine.config

文件的詳細介紹,我以後會寫一篇文章來介紹)      

 

10、Static


核心代碼:

//class1
public static string userName;//在class1中定義靜態全局變量
userName=txtBoxUserName.Text;
Response.Redirect("~/class2.aspx");
//class2
Label1.Text=Src.id;

總結:

一、這個應該是很是容易理解的,在ASP.NET中,每一個頁面對應一個具體的類,既然如此,那麼頁面之間的傳遞,咱們就能夠歸結爲:類與類之間數據的傳遞。想到這一步,問題應該

就迎刃而解了, 由於咱們能夠利用類之間的公關靜態變量來解決這個問題。

二、若合理利用,能夠有效地提升數據傳遞效率,但若濫用,可能會致使用戶或頁面間數據紊亂,存在必定風險和隱患,應謹慎使用。

   提出如下問題:你們能夠分析一下,如下代碼有什麼問題?

//Class1

 protected void btnRedirect_Click(object sender, EventArgs e)
        {
             
            string userName = txtBoxUserName.Text;
            Response.Redirect("~/Class2.aspx");
        }

//Class2

Lable1.Text=userName;

11、補充經常使用頁面之間跳轉


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等等,在這裏就不一一論述了。若之後有時間,將會在此基礎上補充,並逐步完善該篇博文。

 

 

 

註釋:很是感謝你們的拜讀並指教,有些讀者朋友提出對文中某些內容不該該歸爲頁面間的傳值,如web.config,數據庫等。關於這個

問題,我以爲對頁面間的傳值,每一個人都有本身的標準,標準不同,結果應該就不同。

申明一下,本篇博文中,關於頁面間傳值,我是這樣定義的,「頁面間的傳值」指在頁面間確實可以傳遞參數,傳遞數據的,而並不是是某

些教課書上的教條八股文,把頁面間傳值定義死了,我這種定義是基於實際問題,實際能解決頁面間傳值的,即只要能解決頁面間傳值

的,就能夠歸結爲頁面間傳值這一類。

 

 

 

  • 感謝您的閱讀,如有不足之處,歡迎指教,共同窗習、共同進步。
  • 博主網址:http://www.cnblogs.com/wangjiming/。
  • 極少部分文章利用讀書、參考、引用、抄襲、複製和粘貼等多種方式整合而成的,大部分爲原創。
  • 如您喜歡,麻煩推薦一下;如您有新想法,歡迎提出,郵箱:2016177728@qq.com。
  • 能夠轉載該博客,但必須著名博客來源。
相關文章
相關標籤/搜索