asp.net中實現頁面間的參數傳遞
編寫人:CC阿爸
2013-10-27
l 近來在做泛微OA與公司自行開發的系統集成登錄的問題。在研究泛微頁面間傳遞參為參數,綜合得了解了一下現行頁面間傳參數的方式
經過在網大致可以歸類為以下幾種情況,現記錄下來。供日后參考
一、 使用QueryString:
使用QueryString在頁面間傳遞值是一種非常常見的方法,我們在ASP中就常常用到。
優點和缺點
優點:
1.使用簡單,對于安全性要求不高時傳遞數字或是文本值非常有效。
缺點:
1.缺乏安全性,由于它的值暴露在瀏覽器的URL地址中的。
2.不能傳遞對象。
a) 使用方法
1在源頁面的代碼中用需要傳遞的名稱和值構造URL地址。
2.在源頁面的代碼用Response.Redirect(URL);重定向到上面的URL地址中。
3.在目的頁面的代碼使用Request.QueryString["name"];取出URL地址中傳遞的值。
b) 可能出現的問題
1在處理Resonse.QueryString函數漢字參數傳遞時,發生不能完整傳遞參數的具體值的錯誤,解決有兩個方法。
方法一:需要重新設置Web.config中的encoding和全球化設置。
1、首行:<?xmlversion="1.0" encoding="utf-8" ?>
更改為: <?xmlversion="1.0" encoding="GB2312" ?>
2、<!-- 全球化 此節設置應用程序的全球化設置。 -->
<globalization
requestEncoding="utf-8"
responseEncoding="utf-8"
/>
更改為:
<!-- 全球化 此節設置應用程序的全球化設置。 -->
<globalization
requestEncoding="GB2312"
responseEncoding="GB2312"
/>
方法二:使用Server.UrlEncode和Server.UrlDecode對漢字或者特殊字符進行編碼和解碼。
二、 使用application變量是在頁面間傳遞值。
Application變量在整個應用程序生命周期中都是有效的,類似于使用全局變量一樣,所以可以在不同頁面中對它進行存取。它和session變量的區別在于,前者是所有的用戶共用的全局變量,后者是各個用戶獨有的全局變量。
舉個例子來解釋:
網站訪問的計數器變量一般采用Application變量,多個請求訪問時共享這一個變量,均可對它進行操作,該變量可以被整個應用程序的各個頁面直接使用。 用戶登陸的帳號名一般采用Session變量,多個請求訪問時有各自的Session變量,只能對自己的該Session變量進行操作,整個應用程序的各個頁面直接使用這個變量來獲得用戶的基本信息。
(1)優點和缺點
優點:
1.使用簡單,消耗較少的服務器資源。
2.不僅能傳遞簡單數據,還能傳遞對象。
3.數據量大小是不限制的。
缺點:
1.作為全局變量容易被誤操作。
(2)使用方法
三、 使用Session變量
使用Application變量是在頁面間傳遞值的第三種方式。Session變量和Application變量非常類似,它們的區別也已經在上面關于,Application變量時提到了。
(1)優點和缺點
優點:
1.使用簡單,不僅能傳遞簡單數據類型,還能傳遞對象。
2.數據量大小是不限制的。
缺點:
1.在Session變量存儲大量的數據會消耗較多的服務器資源。
(2)使用方法
1.在源頁面的代碼中創建你需要傳遞的名稱和值構造Session變量:Session["Nmae"]="Value(OrObject)";
2.在目的頁面的代碼使用Session變量取出傳遞的值。Result = Session["Nmae"]
四、 使用Cookie對象
使用Cookie對象是在頁面間傳遞值的第四種方式。Cookie用于在用戶瀏覽器上存儲小塊的信息,保存用戶的相關信息,比如用戶訪問某網站
時用戶的ID,用戶的偏好等,用戶下次訪問就可以通過檢索獲得以前的信息。所以Cookie也可以在頁面間傳遞值。Cookie通過HTTP頭在瀏覽器
和服務器之間來回傳遞的。Cookie只能包含字符串的值,如果想在Cookie存儲整數值,那么需要先轉換為字符串的形式。
可以通過遍歷Request對象的Cookie集合可以獲得所有的瀏覽器所有的Cookie。方法如下:
foreach (string strKey in Request.Cookies)
{
lblCookies.Text += strKey + "=" +Request.Cookies[ strKey ].Value;
}
(1)優點和缺點
優點:
1.使用簡單,是保持用戶狀態的一種非常常用的方法。比如在購物網站中用戶跨多個頁面表單時可以用它來保持用戶狀態。
缺點:
1.常常被人認為用來收集用戶隱私而遭到批評。
(2)使用方法
1.在源頁面的代碼中創建你需要傳遞的名稱和值構造Cookie對象:
HttpCookie objCookie = newHttpCookie("myCookie","Hello,Cookie!");
Response.Cookies.Add(cookie);
2.在目的頁面的代碼使用Cookie對象取出傳遞的值:Result = Request.Cookies[ "myCookie" ].Value;
五、 使用Server.Transfer
使用Server.Transfer變量是在頁面間傳遞值的第五種方式。上面的四個方法我們在ASP中常常使用,但是這個方法是在ASP.NET中新出現的
。Server.Transfer是從當前的ASPX頁面轉到新的ASPX頁面,服務器端執行新頁并輸出,在新頁面中通過Context.Handler來獲得前一個頁面傳遞
的各種數據類型的值、表單數據、QueryString.由于重定向完全在服務器端完成,所以客戶端瀏覽器中的URL地址是不會改變的。
調用Server.Transfer時,當前的ASPX頁面終止執行,執行流程轉入另一個ASPX頁面,但新的ASPX頁面仍使用前一ASPX頁面創建的應答流。
[2]
在這里比較一下Server.Transfer和在“一”中使用的Response.Redirect的區別。
(1)Server.Transfer在服務器端完成,所以客戶端瀏覽器中的URL地址是不會改變的;Response.Redirect是客戶端完成,向服務器端提出
新的頁面處理請求,所以客戶端瀏覽器中的URL地址是會改變的。
(2)Server.Transfer在服務器端完成,不需要客戶端提出請求,減少了客戶端對服務器端提出請求。[2]
(3)Server.Transfer只能夠轉跳到本地虛擬目錄指定的頁面,也就是工程項目中的頁面,而Response.Redirect則十分靈活,可以跳轉到任何
URL地址。
(4)Server.Transfer可以將前一個頁面的各種類型的值傳到新的頁面;Response.Redirect則只能借助URL中帶參數或是結合上面四種辦法
把各種類型的值傳到新的頁面。
繼續我們的Server.Transfer用法。
(1)優點和缺點
優點:
1.直接在服務器端重定向,使用簡單方便,減少了客戶端對服務器端提出請求。
2.可以傳遞各種數據類型的值和控件的值。
缺點:
1.客戶端瀏覽器中的URL地址是不改變,會導致在新的頁面可能出現一些意想不到的問題。比如如果源頁面和目的頁面不在同一個虛擬目錄
或其子目錄下,那么使用相對路徑的圖片、超鏈接都會導致錯誤的指向。[3]
(2)使用方法
1.在源頁面的代碼中,使用Page類的Server.Transfer跳到另一個頁面傳遞頁面數據:
Server.Transfer("destinationWebForm.aspx","false")。
2.在目的頁面中,使用Context.Handler來接收數據:
FormerPage formerPage = (FormerPage)Context.Handler;
然后用formerPage的屬性和方法來獲取前一個頁面的值,或者直接用
Context.Items["myParameter "]
來獲取前一個頁面的值。
需要注意的是獲取這些值必須在新的頁面首次加載時,才能正確獲取上一頁面的各種數據類型或是控件的值。在以后的postback時,就無法
獲取上一頁面的各種數據類型或是控件的值了,因為此時得到的當前頁面的實例. 所以需要在新頁面(destinationWebForm.aspx)的Page_Load ()事件中使用if(!IsPostBack)把獲取前一個頁面的值的代碼包含起來,才能獲得前一個頁面傳遞的各種數據類型的值、表單數據、QueryString。
六、 使用POST方式來傳遞參數值(泛微即采用該模式傳集成登錄中設置的用戶名和密碼)
先簡單的介紹一下get與post
l Get:是以實體的方式得到由請求URI所指定資源的信息,如果請求URI只是一個數據產生過程,那么最終要在響應實體中返回的是處理過程的結果所指向的資源,而不是處理過程的描述。
l Post:用來向目的服務器發出請求,要求它接受被附在請求后的實體,并把它當作請求隊列中請求URI所指定資源的附加新子項,Post被設計成用統一的方法實現下列功能:
1. 對現有資源的解釋
2. 向電子公告欄、新聞組、郵件列表或類似討論組發信息。
3. 提交數據塊
4. 通過附加操作來擴展數據庫
從從上面描述可以看出,Get是向服務器發索取數據的一種請求;而Post是向服務器提交數據的一種請求,要提交的數據位于信息頭后面的實體中。
HTTP請求:get與post方法的區別
l 相同點;
Get與post(對于“post”除非相應里有cache-control或者expires頭域指示其相應不可緩存)請求的相應是可緩存的;
l 不同點:
1. Get是從服務器上獲取數據,post是向服務器傳送數據
2. Get是把參數數據隊列加到提交表單的action屬性所指定的URL中,值和表單中各個字段一一對應,在URL中可以看到,post是通過HTTP post機制,將表單內各個字段與其內容放置在html header內一起傳送到action屬性所指的URL地址,用戶看不到這個過程;
3. get傳送的數據量較小,不能大于1024kb;post傳送的數據量較大,一般被默認為不受限制的。但理論上,2G
4. get安全性非常低;post安全性較高;
5. get適用于多請求,而保留post僅用于更新站點;
6. 在form提交的時候,如果不指定method,則默認為get請求,form中提交的數據將會附加在url之后,以?與URL分開。字母數字字符原樣發送,但空格轉換為“+”號,其它符號轉換為%xx,其中xx為該符號為16進制表示的ASCII(或ISO Latin-1)值;
7. get請求提交的數據放置在HTTP請求協議頭中,而post提交的數據則放在實體數據數據中;
在表單中適用“post”和“get”區別
在form里面,可以適用post也可以適用get。它們都是method的合法取值。但是,post和gei方法在適用上至少兩點不同;
1. get方法通過URL請求來傳遞用戶的輸入。Post方法通過另外的形式。
2. get方式的提交需要用Request.QueryString來取得變量的值,而post方式提交時,必須通過Request.Form來訪問提交的內容,如:
Request.Form["參數名"] 、Request["參數名"]、Request.Param["參數名"]
新聞熱點
疑難解答