ASP.NET 頁面之間傳值的幾種方式

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

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

復制代碼
復制代碼
//創建Sessionpublic 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

復制代碼
復制代碼
//遍歷Sessionpublic 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


核心代碼:

復制代碼
復制代碼
//Class1Cache["id"] = TextBox1.Text;Response.Redirect("~/WebForm1.aspx");//Class2if (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、應用程序中的緩存機制用于將需要大量服務器資源來創建的對象存儲在內存中,以此大大改進應用程序的性能。這個機制同樣可以用來傳值。

2、與其他方法不同的是,該方法需要設置緩存項優先級和緩存時間。因為當系統內存缺乏時,緩存機制會自動移除很少使用或優先級較低的項,從而造成傳值失敗。

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

?

六、Cookie


?核心代碼:

復制代碼
復制代碼
//Class1HttpCookie httpCookie = new HttpCookie("testCookie","Page transfers by Cookie");
Response.Redirect("~/Class2.aspx");
//Class2Label1.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"]


核心代碼:

復制代碼
復制代碼
//Class1Context.Items["id"]=TextBox1.Text;Server.Transfer("~/Class2.aspx");
//Class2Label1.Text=Context.Items["id"].ToString();Context.Items.Remove("id"); //移除項
復制代碼
復制代碼

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

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

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

?

八、ViewState


核心代碼:

//Class1
ViewState["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


核心代碼:

復制代碼
復制代碼
//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"];
復制代碼
復制代碼

總結:

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


核心代碼:

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

總結:

1、這個應該是非常容易理解的,在ASP.NET中,每個頁面對應一個具體的類,既然如此,那么頁面之間的傳遞,我們就可以歸結為:類與類之間數據的傳遞。想到這一步,問題應該

就迎刃而解了, 因為我們可以利用類之間的公關靜態變量來解決這個問題。

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

???提出以下問題:大家可以分析一下,以下代碼有什么問題?

復制代碼
復制代碼
//Class1protected void btnRedirect_Click(object sender, EventArgs e){string userName = txtBoxUserName.Text;Response.Redirect("~/Class2.aspx");}//Class2Lable1.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等等,在這里就不一一論述了。若以后有時間,將會在此基礎上補充,并逐步完善該篇博文。

轉載于:https://www.cnblogs.com/zzp0320/p/7878143.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/390771.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/390771.shtml
英文地址,請注明出處:http://en.pswp.cn/news/390771.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Mapreduce原理和YARN

MapReduce定義 MapReduce是一種分布式計算框架&#xff0c;由Google公司2004年首次提出&#xff0c;并貢獻給Apache基金會。 MR版本 MapReduce 1.0&#xff0c;Hadoop早期版本(只支持MR模型)MapReduce 2.0&#xff0c;Hadoop 2.X版本&#xff08;引入了YARN資源調度框架后&a…

數據可視化圖表類型_數據可視化中12種最常見的圖表類型

數據可視化圖表類型In the current era of large amounts of information in the form of numbers available everywhere, it is a difficult task to understand and get insights from these dense piles of data.在當今時代&#xff0c;到處都是數字形式的大量信息&#xff…

三大紀律七項注意(Access數據庫)

三大紀律&#xff08;規則或范式&#xff09; 要有主鍵其他字段依賴主鍵其他字段之間不能依賴七項注意 一表一主鍵(訂單表&#xff1a;訂單號&#xff1b;訂單明細表&#xff1a;訂單號產品編號)經常查&#xff0c;建索引&#xff0c;小數據&#xff08;日期&#xff0c;數字類…

CentOS下安裝JDK的三種方法

來源&#xff1a;Linux社區 作者&#xff1a;spiders http://www.linuxidc.com/Linux/2016-09/134941.htm 由于各Linux開發廠商的不同,因此不同開發廠商的Linux版本操作細節也不一樣,今天就來說一下CentOS下JDK的安裝: 方法一&#xff1a;手動解壓JDK的壓縮包&#xff0c;然后…

MapReduce編程

自定義Mapper類 class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> &#xff5b; … }自定義mapper類都必須實現Mapper類&#xff0c;有4個類型參數&#xff0c;分別是&#xff1a; Object&#xff1a;Input Key Type-------------K1Text: Input…

統計信息在數據庫中的作用_統計在行業中的作用

統計信息在數據庫中的作用數據科學與機器學習 (DATA SCIENCE AND MACHINE LEARNING) Statistics are everywhere, and most industries rely on statistics and statistical thinking to support their business. The interest to grasp on statistics also required to become…

IOS手機關于音樂自動播放問題的解決辦法

2019獨角獸企業重金招聘Python工程師標準>>> 評估手機自帶瀏覽器不能識別 aduio標簽重的autoplay屬性 也不能自動執行play()方法 一個有效的解決方案是在微信jssdk中調用play方法 document.addEventListener("WeixinJSBridgeReady", function () { docum…

svg標簽和svg文件區別_什么是SVG文件? SVG圖片和標簽說明

svg標簽和svg文件區別SVG (SVG) SVG or Scalable Vector Graphics is a web standard for defining vector-based graphics in web pages. Based on XML the SVG standard provides markup to describe paths, shapes, and text within a viewport. The markup can be embedded…

開發人員怎么看實施人員

英文原文&#xff1a;What Developers Think Of Operations&#xff0c;翻譯&#xff1a;張紅月CSDN 在一個公司里面&#xff0c;開發和產品實施對于IS/IT的使用是至關重要的&#xff0c;一個負責產品的研發工作&#xff0c;另外一個負責產品的安裝、調試等工作。但是在開發人員…

怎么評價兩組數據是否接近_接近組數據(組間)

怎么評價兩組數據是否接近接近組數據(組間) (Approaching group data (between-group)) A typical situation regarding solving an experimental question using a data-driven approach involves several groups that differ in (hopefully) one, sometimes more variables.使…

代碼審計之DocCms漏洞分析

0x01 前言 DocCms[音譯&#xff1a;稻殼Cms] &#xff0c;定位于為企業、站長、開發者、網絡公司、VI策劃設計公司、SEO推廣營銷公司、網站初學者等用戶 量身打造的一款全新企業建站、內容管理系統&#xff0c;服務于企業品牌信息化建設&#xff0c;也適應用個人、門戶網站建設…

你讓,勛爵? 使用Jenkins聲明性管道的Docker中的Docker

Resources. When they are unlimited they are not important. But when theyre limited, boy do you have challenges! 資源。 當它們不受限制時&#xff0c;它們并不重要。 但是&#xff0c;當他們受到限制時&#xff0c;男孩你有挑戰&#xff01; Recently, my team has fa…

翻譯(九)——Clustered Indexes: Stairway to SQL Server Indexes Level 3

原文鏈接&#xff1a;www.sqlservercentral.com/articles/StairwaySeries/72351/ Clustered Indexes: Stairway to SQL Server Indexes Level 3 By David Durant, 2013/01/25 (first published: 2011/06/22) The Series 本文是階梯系列的一部分&#xff1a;SQL Server索引的階梯…

power bi 中計算_Power BI中的期間比較

power bi 中計算Just recently, I’ve come across a question on the LinkedIn platform, if it’s possible to create the following visualization in Power BI:就在最近&#xff0c;我是否在LinkedIn平臺上遇到了一個問題&#xff0c;是否有可能在Power BI中創建以下可視化…

-Hive-

Hive定義 Hive 是一種數據倉庫技術&#xff0c;用于查詢和管理存儲在分布式環境下的大數據集。構建于Hadoop的HDFS和MapReduce上&#xff0c;用于管理和查詢分析結構化/非結構化數據的數據倉庫; 使用HQL&#xff08;類SQL語句&#xff09;作為查詢接口&#xff1b;使用HDFS作…

CentOS 7 安裝 JDK

2019獨角獸企業重金招聘Python工程師標準>>> 1、下載oracle jdk 下載地址&#xff1a; http://www.oracle.com/technetwork/java/javase/downloads/index.html 選擇同一協議&#xff0c;下載rpm格式版本jdk&#xff0c;或tar.gz格式jdk。 2、卸載本機openjdk 2.1、查…

javascript 布爾_JavaScript布爾說明-如何在JavaScript中使用布爾

javascript 布爾布爾型 (Boolean) Booleans are a primitive datatype commonly used in computer programming languages. By definition, a boolean has two possible values: true or false.布爾值是計算機編程語言中常用的原始數據類型。 根據定義&#xff0c;布爾值有兩個…

如何進行數據分析統計_對您不了解的數據集進行統計分析

如何進行數據分析統計Recently, I took the opportunity to work on a competition held by Wells Fargo (Mindsumo). The dataset provided was just a bunch of numbers in various columns with no indication of what the data might be. I always thought that the analys…

經典:區間dp-合并石子

題目鏈接 &#xff1a;http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid737 這個動態規劃的思是&#xff0c;要得出合并n堆石子的最優答案可以從小到大枚舉所有石子合并的最優情況&#xff0c;例如要合并5堆石子就可以從&#xff0c;最優的23和14中得到最佳的答案。從兩堆…

常見排序算法_解釋的算法-它們是什么以及常見的排序算法

常見排序算法In its most basic form, an algorithm is a set of detailed step-by-step instructions to complete a task. For example, an algorithm to make coffee in a french press would be:在最基本的形式中&#xff0c;算法是一組完成任務的詳細分步說明。 例如&…