asp.net 常用傳值方式及其優缺點分析
一、使用response.Redirect
這種方式是一種最簡單的傳值方式,使用簡單方便。但是有一個缺點,它傳送的值顯示在瀏覽器的位址列中,如果不是傳遞的資料安全性不是很高,可以使用這個方法。但是對於傳送陣列和物件的時候,用這個方法就不可以了。
傳值頁面:
接收頁面:protected void BtSearchHistory_Click(object sender, EventArgs e) { Response.Redirect("attdendanceHistory.aspx?groupno="+lblgroupno.Text.Trim()+"&"+"UserRoles="+ lblUserRoles.Text.Trim()); }
{ // 獲取傳遞過來的groupno和UserRoles</span>
缺點:if (Request.Params["groupno"] != null && Request.Params["groupno"].Trim() != "") { groupno = Request.Params["groupno"]; } if(Request.QueryString["UserRoles"] !=null && Request.QueryString["UserRoles"].Trim() !="") { userRoles = Request.QueryString["UserRoles"]; } }
如下圖,會在位址列中顯示傳遞值的資訊,不安全。不能夠傳遞物件
優點:
經典的傳值方式,使用非常簡單。
二、使用application物件變數傳值
application物件的作用範圍是整個全域性,所以對所有的使用者都有效,和其配合在一起使用的方法是Lock和Unlock,用這兩個方法可以處理多個用於對儲存在Application物件的寫入問題。Lock方法鎖定全部的Application變數,從而阻止其他使用者修改Application物件的變數值。而UnLock是解除對Application物件的鎖定。
傳送頁:
接收頁:protected void Page_Load(object sender, EventArgs e) { //Application傳值 string name; application.lock(); name = application["name"].tostring(); label1.text = name; application.unlock(); }
protected void Button1_Click(object sender, EventArgs e)
{
//application傳值
Application["name"] = "小娟娟";
Server.Transfer("get.aspx");
}
使用場景:這種方式是通過HttpApplication物件在伺服器生成一個狀態來儲存所需要的資訊,該Httpapplication物件變數可以作用於真個web應用程式,所以該物件一般儲存一些要公佈的資訊,而對於那些涉及到使用者個人的敏感資料,就不適合用這個方式來儲存。
對比Session:
Session是對於每個單獨的使用者,當用戶關閉當前瀏覽器,那麼Session會失效。Application 物件儲存的變數是針對於所有訪問程式的使用者,即使有使用者關閉了瀏覽器,變數的值也不會丟失。
三、cookie傳值
cookie 是儲存區在使用者自己的電腦中,以文字的形式存在於磁碟中。這種方式很有意思,很多登入系統就是利用Cookie實現使用者身份自動登入。使用者登入一次的登入資訊將被寫入到使用者電腦的cookie檔案中,下次登入的時候,網站自動讀取cookie完成使用者身份驗證。和seesion使用的方法差不多,但是cookie是存放在客戶端的,session是存放在伺服器端的,cookie的使用要配合AsP.net內建物件request來使用。
需要注意的是:多數瀏覽器支援最多可以4096位元組的cookie,那麼要將為數不多的幾個值儲存在使用者計算機上,瀏覽器還限制了每個站點可以在使用者計算機上儲存的cookie資料。因為使用者還可以設定自己的瀏覽器,拒絕接受cookie,這種情況下,只能夠使用別的方式了。
傳送頁:
protected void Button6_Click(object sender, EventArgs e)
{
HttpCookie cookie = new HttpCookie("UserName");
cookie.Value = "小娟娟";
Response.AppendCookie(cookie);
Server.Transfer("get.aspx");
}
接收頁:
//cookie傳值
Label1.Text = Request.Cookies["UserName"].Value.ToString();
優點:資料傳遞方式方便,儲存在客戶端,不佔用伺服器資源。
缺點:安全性不高,我們開發人員不應該過多的依賴於cookie,而應該用結合的方式完成對敏感資料的儲存。(2)多數瀏覽器對於cookie會有個數限制,而且並非所有瀏覽器都支援cookie,使用者可以禁止和刪除cookie,這種情況下使用就要十分小心了。
綜上所述:cookie還是少用吧。
四、session傳值和使用session作用於使用者個人,所有過多的儲存會導致伺服器的記憶體資源耗盡。這一段時間關於登陸和許可權判斷,用的最多的就是session,瞭解也比較多 ,除了傳值,也寫一下使用Session需要注意的東西。
建立Session:
//建立Session
HttpContext.Current.Session["teacherID"] = currentUser.UserID;
HttpContext.Current.Session["operater"] = currentUser.UserName;</span>
接收session:
#region 從登陸session 獲取使用者名稱和角色
if (Session["userinfo"] == null || Session["userinfo"].ToString() == "")
{
Maticsoft.Common.MessageBox.ShowAndRedirect(this, "請登入後檢視!", "/Mobile/Login.aspx");
return;
}
//獲取操作員和IP
lblTeacherName.Text = Session["operater"].ToString();
//獲取操作員和IP
lblTeacherID.Text = Session["teacherID"].ToString();
#endregion
Session 使用的時候,一定要判斷一下是否為空,增強程式碼的嚴謹性。這兩天進入測試階段,注意到以前很多沒有注意的問題,稍後會總結。
優點:
這種方法將資料儲存在伺服器中,可以傳遞一個物件,傳遞資料比較多,安全性比較高。session 可以在應用程式的多個頁面中以名稱/值對的方式共享,直到瀏覽器使用者關閉自己的瀏覽器或者Session超時。(Session的時間可以自己設定,不設定,預設是20分鐘),所以常用於登入身份驗證中。例如:可以傳遞一個UserInfo,在別的頁面,可以任意取Use的各種屬性值。
缺點:
過多的Session會消耗伺服器的伺服器資源,所以使用要慎重。
五、使用Server.Transfer方法
網上資料說這個才是面向物件所使用的方法,使用Server.Transfer方法把流程從當前一個頁面引導到另外一個頁面,新的頁面使用前一個頁面的應答劉,所以這個方法是完全面向物件的。
使用這個方法我們可以在另一個頁面以公開物件屬性的方式來取值,首先定義一個public許可權的屬性,該屬性返回所需要傳遞的值。然後context..Handler屬性來獲得前一個頁面例項物件的引用,也就是可以通過訪問自定義的屬性來獲取需要的值。
傳送頁:
protected void Button7_Click(object sender, EventArgs e)
{
Server.Transfer("get.aspx");
}
public string name
{
get { return "我是小娟娟"; }
}
接收頁:
//server.Transer傳值
a newweb;
newweb = (source)Context.Handler;
Label1.Text = newweb.name;
這裡面有一個問題,newweb=(source)Context.Handler中,這個source報錯,應該是少了什麼引用,沒有成功的執行出來,我還需要再查詢一下。
六、站在巨人們的肩膀上
小結:
故事還沒有完結,回想一下get/post/MVC中如何使用,還需要再複習一下。