1. Get(即使用QueryString顯式傳遞)
方式:在url後面跟參數。
特點:簡單、友善。
缺點:字元串長度最長為255個字元;資料洩漏在url中。
适用資料:簡單、少量、關鍵的資料。
适用範圍:傳遞給自己、傳遞給另一個目标頁面;常用于2個頁面間傳遞資料。
用法:例如:url後加?UserID=…,跳轉到目标頁面,目标頁面在伺服端可用Request.QueryString["InputText"]擷取其指定參數值。
2. Post
方式:通用的方式。利用form送出。
特點:最常用的方法。常用技巧是把隐秘的資料存在隐藏域中由form送出。
适用資料:大量資料,包括檔案上傳。
适用範圍:同Get方法
用法:在用戶端form指定action目标後submit、在asp.net的伺服端中使用server.Transfer(url)送出;在伺服端中用Request.Form["FormFieldID"]擷取。 3. 頁面對象的屬性
方式:asp.net特有方式 。利用HttpContext擷取發請求的頁面的資訊。
特點:可以直接存儲對象。
缺點:注意強制轉換的類型要正确。
适用資料:各種資料。
适用範圍:頁面之間傳遞複雜資料。
用法:擷取Context.Handler将其轉換為發請求的頁面的執行個體,随後就可以輕松通路其form中的字段、甚至屬性。其中的Context是指HttpContext對象,Handler是其屬性,Context.Handler的意思可以了解為建立源頁類的執行個體變量,而得到此執行個體之後,就可以直接通路其中的屬性和Public方法了。 4. cookie
方式:将資料存在用戶端的經典方法。
缺點:安全性低、受用戶端設定限制、一個站點僅存20個cookie,每個容量4096位元組。
有效期:自定義或被使用者清除
适用資料:使用者的會話資料(一般是使用者名,使用者的個性化設定資訊等)
适用範圍:單個使用者、整個站點所有頁面
用法:引用Request.Cookies(讀取資訊)、Response.Cookies(寫入資訊)、或用HttpCookieCollection直接建立Cookie對象。 5. Session
方式:将使用者資料存儲在伺服端。
特點:asp.net中可以設定session的存儲方式、位置、SessionID的儲存是否依賴cookie。
可以直接存儲對象。
缺點:asp.net中有失效的隐患
有效期:使用者活動時間+自定義延遲。
适用資料:使用者的特有資訊。
适用範圍:單個使用者、整個站點所有頁面。
用法:Session["CollectionName"] = value/object; 6. Cache
方式:将使用者資料存儲在伺服端資料緩存中。
特點:可以大大提高效率。 可以直接存儲對象。
缺點:資料更新不及時。
有效期:應用程式生命周期或自定義。
适用資料:所有頁面、所有使用者都可以共享的資料。
用法:Cache["CollectionName"] = value|object; 7. Appliction
方式: 将資料存儲于此,相當于全局變量。
特點:可以直接存儲對象。整個站點的共享資料。
有效期:應用程式生命周期。
适用資料:所有頁面、所有使用者共享的資料。
用法:Appliction["CollectionName"] = value|object; 8. ViewState
方式:asp.net特有機制,用來恢複頁面狀态。
特點:将頁面各控件及其所存資料序列化存在name為_ViewState的隐藏域中。
缺點:存在HTML中,安全性較低。可以設定加密和驗證,但資料量會大增、效率有影響。
适用資料:頁面PostBack需要儲存的資料,資料太大會影響頁面發送效率。
适用範圍:頁面自身資料儲存。
用法:ViewState["CollectionName"] = value; 9. Static
方式: 将資料存于靜态變量中。
特點:利于提高效率。
缺點:若用不好會緻使使用者或頁面間資料紊亂,造成極大的隐患。建議隻指派一次,絕對禁止為單個使用者而更改此值。
适用資料:所有使用者共享的資料。
适用範圍:此類所有的頁面執行個體。
用法:在class中聲明靜态變量。 整理:
頁面自身儲存資料可用的有ViewState,static變量。
頁面之間傳遞資料常用get,post,HttpContext,當然可以變通一下用于自身資料儲存。
單使用者的所有頁面資料共享常用session,cookie,當然也可以應用在以上兩種情況。
整個應用程式(所有使用者所用頁面)的資料共享常用Appliction,cache,static變量。 總結:
當然可以變通下靈活應用來解決問題,但是要選擇合适的,常見到濫用Get和Session。
建議在用Request的時候要指明所取的集合,比如Get方法傳來的參數從QueryString集合取,Post的從Form取,cookie從Cookies裡取。雖然用Request[]集合,以上幾種都可以取到,但是卻造成性能上的浪費,本來直接在Form集合中,卻周遊了QueryString,Form,Cookies等集合才取出來。 第一種方法:
通過URL連結位址傳遞
send.aspx:
protected void Button1_Click(object sender, EventArgs e)
{
Request.Redirect("Default2.aspx?username=honge");
}
receive.aspx:
string username = Request.QueryString["username"];這樣可以得到參數值。
第二種方法:
通過post方式。
send.aspx
<form id="form1" runat="server" action="receive.aspx" method=post>
<div>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
<asp:TextBox ID="username" runat="server"></asp:TextBox>
</div>
</form>
receive.aspx
string username = Ruquest.Form["receive"];
第三種方法:
通過session
send.aspx:
protected void Button1_Click(object sender, EventArgs e)
{
Session["username"] = "honge";
Request.Redirect("Default2.aspx");
}
receive.aspx:
string username = Session["username"];這樣可以得到參數值。
第四種方法:
通過Application
send.aspx:
protected void Button1_Click(object sender, EventArgs e)
{
Application["username"] = "honge";
Request.Redirect("Default2.aspx");
}
receive.aspx:
string username = Application["username"];這樣可以得到參數值。
第五種方法:
通過Server.Transfer
send.aspx:
public string Name
{
get {
return "honge";
}
}
protected void Button1_Click(object sender, EventArgs e)
{
Server.Transfer("Default2.aspx");
}
receive.aspx:
send d = Context.Handler as send ;
if (d != null)
{
Response.Write(d.Name);這樣可以得到參數值。
}
如果在asp.net 2.0中還可以這樣用:通過PreviousPage
PreviousPage d = Context.Handler as PreviousPage ;
if (d != null)
{
Response.Write(d.Name);這樣可以得到參數值。
}
也可以這樣用:
send.aspx:
<asp:Button ID="btnSubmit" runat="server" PostBackUrl="~/reveive.aspx" Text="Submit" />
receive.aspx:
<%@ PreviousPageType VirtualPath="~/Default.aspx" %>
string name = PreviousPage.Name;這樣可以得到參數值。
如果你的頁面中用到了MasterPage的話 Server.Transfer 傳遞的 PreviousPage就無效了,不知道這是什麼原因.是以在用到MasterPage的話,最好用Session或是Context.Items["username"]來實作.
使用QueryString
使用QuerySting在頁面間傳遞值已經是一種很老的機制了,這種方法的主要優點是實作起來非常簡單,然而它的缺點是傳遞的值是會顯示在浏覽器的位址欄上的(不安全),同時又不能傳遞對象,但是在傳遞的值少而安全性要求不高的情況下,這個方法還是一個不錯的方案。使用這種方法的步驟如下:
1,使用控件建立web表單(form)
2,建立可以傳回表單的按鈕和連結按鈕
3,在按鈕或連結按鈕的單擊事件裡建立一個儲存URL的字元變量
4,在儲存的URL裡添加QueryString參數
5,使用Response.Redirect重定向到上面儲存的URL
下面的代碼片斷示範了如何實作這個方法:
源頁面代碼:
private void Button1_Click
(object sender, System.EventArgs e)
{
string url;
url="anotherwebform.aspx?name=" + TextBox1.Text + "&email=" + TextBox2.Text;
Response.Redirect(url);
}
目标頁面代碼:
private void Page_Load
(object sender, System.EventArgs e)
{
Label1.Text=Request.QueryString["name"];
Label2.Text=Request.QueryString["email"];
}
使用Session變量
使用Session變量是可以在頁面間傳遞值的的另一種方式,在本例中我們把控件中的值存在Session變量中,然後在另一個頁面中使用它,以不同頁面間實作值傳遞的目的。但是,需要注意的是在Session變量存儲過多的資料會消耗比較多的伺服器資源,在使用session時應該慎重,當然了,我們也應該使用一些清理動作來去除一些不需要的session來降低資源的無謂消耗。使用Session變量傳遞值的一般步驟如下:
1,在頁面裡添加必要的控件
2,建立可以傳回表單的按鈕和連結按鈕
3,在按鈕或連結按鈕的單擊事件裡,把控件的值添加到session變量裡
4,使用Response.Redirect方法重定向到另一個頁面
5,在另一個頁面提取session的值,在确定不需要使用該session時,要顯式清除它
下面的代碼片斷示範了如何實作這個方法:
源頁面代碼:
private void Button1_Click
(object sender, System.EventArgs e)
{
file://textbox1 and textbox2 are webform
file://controls
Session["name"]=TextBox1.Text;
Session["email"]=TextBox2.Text;
Server.Transfer("anotherwebform.aspx");
}
目标頁面代碼:
private void Page_Load
(object sender, System.EventArgs e)
{
Label1.Text=Session["name"].ToString();
Label2.Text=Session["email"].ToString();
Session.Remove("name");
Session.Remove("email");
}
使用Server.Transfer
這個方法相比上面介紹的方法稍微複雜一點,但在頁面間值傳遞中卻是特别有用的,使用該方法你可以在另一個頁面以對象屬性的方式來存取顯露的值,當然了,使用這種方法,你需要額外寫一些代碼以建立一些屬性以便可以在另一個頁面通路它,但是,這個方式帶來的好處也是顯而易見的。總體來說,使用這種方法是簡潔的同時又是面向對象的。使用這種方法的整個過程如下:
1,在頁面裡添加必要的控件
2,建立傳回值的Get屬性過程
3,建立可以傳回表單的按鈕和連結按鈕
4,在按鈕單擊事件處理程式中調用Server.Transfer方法轉移到指定的頁面
5,在第二個頁面中,我們就可以使用Context.Handler屬性來獲得前一個頁面執行個體對象的引用,通過它,就可以使用存取前一個頁面的控件的值了
以下代碼綜合實作上述步驟過程的代碼:
源頁面代碼:
把以下的代碼添加到頁面中
public string Name
{
get
{
return TextBox1.Text;
}
}
public string EMail
{
get
{
return TextBox2.Text;
}
}
然後調用Server.Transfer方法
private void Button1_Click
(object sender, System.EventArgs e)
{
Server.Transfer("anotherwebform.aspx");
}
目标頁面代碼:
private void Page_Load
(object sender, System.EventArgs e)
{
file://create instance of source web form
WebForm1 wf1;
file://get reference to current handler instance
wf1=(WebForm1)Context.Handler;
Label1.Text=wf1.Name;
Label2.Text=wf1.EMail;
}
總結
本文講述了使用不同的方法實作了ASP.NET頁面間值傳遞,這三種方法是:QueryString,Session和Server.Transfer,我們應該反覆體會幾種方法的異同。我希望本文能給你有用的助益,直到在你的代碼中運用自如!