在開發ASP.NET 以及ASP.NET Core過程中主要使用的頁面傳值的方法有以下幾種:
Request.QueryString[] Request.Form[] 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="nueq",則 Reuqest.QueryString["name"]的值為“neuq”。
2、Request.Form
代碼如下:
protected void getQueryString_Click(object sender, EventArgs e) { string strQueForm = Request.Form["TextBox1"]; Response.Write(strQueForm); }
分析:
Request.Form獲取窗體變量集合有兩重載(一般Form表單post提交至后台的數據)。即Request.Form[string name] 和Request.Form[int index],獲取表單指定名稱的參數值。
3、Session基本操作
a、創建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中的數據,代碼如下:
public void getSession() { IEnumerator sessionEnum =Session.Keys.GetEnumerator(); While(sessionEnum.MoveNext) { Response.Write(Session[sessionEnum.Current.ToString()].ToString()+","); } }
d、清空Session數據但是不會結束會話。代碼如下:
Session.Clear();
e、結束會話,代碼如下:
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秒鍾;
4、Application
示例代碼如下:
//a.aspx //// private void Button1_Click(object sender, System.EventArgs e) { Application["name"] = Label1.Text; } ////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方法用來鎖定和解鎖,為了防止並發修改。
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)); 總結如下: 1、應用程序中的緩存機制用於將需要大量服務器資源來創建的對象存儲在內存中,以此大大改進應用程序的性能。這個機制同樣可以用來傳值。 2、與其他方法不同的是,該方法需要設置緩存項優先級和緩存時間。因為當系統內存缺乏時,緩存機制會自動移除很少使用或優先級較低的項,從而造成傳值失敗。 3、該方法的優點是傳遞數據的大小和數量無限制,速度快。缺點是緩存機制的操作相對比較復雜。
6、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、安全性不高,容易偽造。
7、 Context.Items["id"]
Contextu對象包含與當前頁面相關的信息,提供對整個上下文的訪問、包括請求、響應、以及上下文中的信息;
可以使用此對象在網頁之間共享信息,從而實現頁面之間的傳值;
與使用Form的方法類似,該方法也能保持大量的數據,缺點也相同,但是使用方法相對比較簡單;
8、ViewState
示例代碼:
ViewState["id"]="hello nueq" //數據保存 Label1.Text=ViewState["id"].ToString();//數據取出 ViewState.Remove("id");//刪除數據
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"]; 總結: 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