ASPNET WEB FORMS給開發者提供了極好的事件驅動開發模式然而這種簡單的應用程序開發模式卻給我們帶來了一些小問題舉個例子在傳統的ASP應用程序中你能夠通過POST方法很容易的把一個值或多個值從一個頁面傳送到另一個頁面用同樣的方法在ASPNET中實現有點麻煩在這裡我們可以通過其他方式來解決這種情形ASPNET為我們提供了三種方式一種是可以通過用QueryString來傳送相應的值再一種是通過session變量來傳送相應的值還有就是通過ServerTransfer方法來實現下面分別一一介紹
一使用Querystring
Querystring是一種非常簡單的傳值方式其缺點就是會把要傳送的值顯示在浏覽器的地址欄中並且在此方法中不能夠傳遞對象如果你想傳遞一個安全性不是那麼太重要或者是一個簡單的數值時用此方法最好不過了下面通過一個小例子來完成傳值工作步驟如下
創建一個web form
在新建的web form中放置一個button在放置兩個TextBoxTextBox
為button按鈕創建click事件
代碼如下
private void Button_Click
(object sender SystemEventArgs e)
{
string url;
url=webformaspx?name= +
TextBoxText + &email= +
TextBoxText;
ResponseRedirect(url);
}
新建一個目標頁面命名為webform
在webform中放置兩個LabelLabel
在webform的Page_Load中添加如下代碼
private void Page_Load
(object sender SystemEventArgs e)
{
LabelText=RequestQueryString[name];
LabelText=RequestQueryString[email];
}
運行即可看到傳遞後的結果了
二使用Session變量
使用Session變量傳值是一種最常見的方式了此中方式不僅可以把值傳遞到下一個頁面還可以交叉傳遞到多個頁面直至把Session變量的值removed後變量才會消失舉個例子看看
創建一個web form
在新建的web form中放置一個button在放置兩個TextBoxTextBox
為button按鈕創建click事件
代碼如下
private void Button_Click
(object sender SystemEventArgs e)
{
Session[name]=TextBoxText;
Session[email]=TextBoxText;
ResponseRedirect(webformaspx);
}
新建一個目標頁面命名為webform
在webform中放置兩個LabelLabel
在webform的Page_Load中添加如下代碼
private void Page_Load
(object sender SystemEventArgs e)
{
LabelText=Session[name]ToString();
LabelText=Session[email]ToString();
SessionRemove(name);
SessionRemove(email);
}
運行即可看到傳遞後的結果了
三使用ServerTransfer
雖然這種方法有點復雜但也不失為一種在頁面傳值的方式
舉個例子看看
創建一個web form
在新建的web form中放置一個button在放置兩個TextBoxTextBox
為button按鈕創建click事件
代碼如下
private void Button_Click
(object sender SystemEventArgs e)
{
ServerTransfer(webformaspx);
}
創建過程來返回TextBoxTextBox控件的值代碼如下
public string Name
{
get
{
return TextBoxText;
}
}
public string EMail
{
get
{
return TextBoxText;
}
}
新建一個目標頁面命名為webform
在webform中放置兩個LabelLabel
在webform的Page_Load中添加如下代碼
private void Page_Load
(object sender SystemEventArgs e)
{
//創建原始窗體的實例
WebForm wf;
//獲得實例化的句柄
wf=(WebForm)ContextHandler;
LabelText=wfName;
LabelText=wfEMail;
}
運行即可看到傳遞後的結果了
一 打開新頁面並傳值
使用ResponseRedirect()
// WebFormaspx下
string Message = ServerUrlEncode(你好世界!);
ResponseRedirect(WebFormaspx?Msg= + Message);
//Webformaspx 接收傳來的值
string strMsg = ServerUrlDecode(RequestQueryString[Msg]);
使用腳本
//WebFormaspx下
ResponseWrite(
<script>windowopen(WebFormaspx?Msg= + Message + )</script>);
// WebFormaxpx
string strMsg=RequestQueryString[Msg];
二使用ServerTransfer()傳遞值
假設將WebFormaspx上的TextBox的Text傳遞到WebFormaspx則可以這樣
在WebFormaspx上加一Button用來轉向WebFormaspx
Clieck事件內增加代碼:
ServerTransfer(WebFormaspx true);
在WebFormaspx上接受WebFormaspx上的值:
string text=RequestForm[TextBox] ;
使用QueryString
使用QuerySting在頁面間傳遞值已經是一種很老的機制了這種方法的主要優點是實現起來非常簡單然而它的缺點是傳遞的值是會顯示在浏覽器的地址欄上的(不安全)同時又不能傳遞對象但是在傳遞的值少而安全性要求不高的情況下這個方法還是一個不錯的方案使用這種方法的步驟如下:
使用控件創建web表單(form)
創建可以返回表單的按鈕和鏈接按鈕
在按鈕或鏈接按鈕的單擊事件裡創建一個保存URL的字符變量
在保存的URL裡添加QueryString參數
使用ResponseRedirect重定向到上面保存的URL
下面的代碼片斷演示了如何實現這個方法
源頁面代碼
private void Button_Click
(object sender SystemEventArgs e)
{
string url;
url=anotherwebformaspx?name= + TextBoxText + &email= + TextBoxText;
ResponseRedirect(url);
}
目標頁面代碼
private void Page_Load
(object sender SystemEventArgs e)
{
LabelText=RequestQueryString[name];
LabelText=RequestQueryString[email];
}
使用Session變量
使用Session變量是可以在頁面間傳遞值的的另一種方式在本例中我們把控件中的值存在Session變量中然後在另一個頁面中使用它以不同頁面間實現值傳遞的目的但是需要注意的是在Session變量存儲過多的數據會消耗比較多的服務器資源在使用session時應該慎重當然了我們也應該使用一些清理動作來去除一些不需要的session來降低資源的無謂消耗使用Session變量傳遞值的一般步驟如下
在頁面裡添加必要的控件
創建可以返回表單的按鈕和鏈接按鈕
在按鈕或鏈接按鈕的單擊事件裡把控件的值添加到session變量裡
使用ResponseRedirect方法重定向到另一個頁面
在另一個頁面提取session的值在確定不需要使用該session時
要顯式清除它
下面的代碼片斷演示了如何實現這個方法
源頁面代碼
private void Button_Click
(object sender SystemEventArgs e)
{
//textbox and textbox are webform
//controls
Session[name]=TextBoxText;
Session[email]=TextBoxText;
ServerTransfer(anotherwebformaspx);
}
目標頁面代碼
private void Page_Load
(object sender SystemEventArgs e)
{
LabelText=Session[name]ToString();
LabelText=Session[email]ToString();
SessionRemove(name);
SessionRemove(email);
}
使用ServerTransfer
這個方法相比上面介紹的方法稍微復雜一點但在頁面間值傳遞中卻是特別有用的使用該方法你可以在另一個頁面以對象屬性的方式來存取顯露的值當然了使用這種方法你需要額外寫一些代碼以創建一些屬性以便可以在另一個頁面訪問它但是這個方式帶來的好處也是顯而易見的總體來說使用這種方法是簡潔的同時又是面向對象的使用這種方法的整個過程如下
在頁面裡添加必要的控件
創建返回值的Get屬性過程
創建可以返回表單的按鈕和鏈接按鈕
在按鈕單擊事件處理程序中調用ServerTransfer方法轉移到指定的頁面
在第二個頁面中我們就可以使用ContextHandler屬性來獲得前一個頁面實例對象的引用通過它就可以使用存取前一個頁面的控件的值了
以下代碼綜合實現上述步驟過程的代碼
源頁面代碼:
把以下的代碼添加到頁面中
public string Name
{
get
{
return TextBoxText;
}
}
public string EMail
{
get
{
return TextBoxText;
}
}
然後調用ServerTransfer方法
private void Button_Click
(object sender SystemEventArgs e)
{
ServerTransfer(anotherwebformaspx);
}
目標頁面代碼
private void Page_Load
(object sender SystemEventArgs e)
{
//create instance of source web form
WebForm wf;
//get reference to current handler instance
wf=(WebForm)ContextHandler;
LabelText=wfName;
LabelText=wfEMail;
}
在ASPNET 中啟用了跨頁面傳送功能其功能和用法在以後在做介紹!
頁面之間傳遞值
方式
在接收頁 的html代碼裡加上一行 <%@ Reference Page = WebFormaspx %>
WebForm fp=(WebForm)ContextHandler;
thisTextBoxText=fpname; //name 是第一頁的public變量
Context 提供對整個當前上下文(包括請求對象)的訪問您可以使用此類共享頁之間的信息
方式GET方式
在發送頁
public int sum=;
int i =intParse(thisTextBoxText)*;
ServerTransfer(WebFormaspx?sum=+i);
接收頁
thisTextBoxText=Request[sum]ToString();
or thisTextBoxText=RequestParams[sum]ToString();
thisTextBoxText=RequestQueryString[sum];
方法全局變量
發送頁
Application[sum]=thisTextBoxText;
ServerTransfer(WebFormaspx);
接收頁
thisTextBoxText=(string)Application[sum];
Application實質上是整個虛擬目錄中所有文件的集合如果想在整個應用范圍內使用某個變量值Application對象將是最佳的選擇
在這裡用Session[]的方法雷同
方法
發送頁
定義靜態變量 public static string str=;
str=thisTextBoxText;
ServerTransfer(webformaspx);
接收頁
引入第一頁的命名空間using WebApplication;
thisTextBoxText=WebFormstr;
使用session
把Visual Studio Net的當前窗口切換到WebForm頁面的代碼編輯窗口即WebFormaspxcs文件的編輯窗口用下列代碼替換WebFormaspxcs中的Button組件的Click事件對應的處理代碼下列代碼的功能是使用Session實現源頁面向目標頁面傳遞數據
private void Button_Click ( object sender System EventArgs e )
{
Session [ name ] = TextBox Text ;
//創建Session變量用以存放TextBox組件中的數據
Session [ email ] = TextBox Text ;
//創建Session變量用以存放TextBox組件中的數據
Server Transfer ( WebFormaspx ) ;
//向目標頁面傳遞數據如果你是其他頁面則替換上面的WebFormaspx
}
把Visual Studio Net的當前窗口切換到WebForm頁面的代碼編輯窗口即WebFormaspxcs文件的編輯窗口用下列代碼替換WebFormaspxcs中Page的Load事件對應的處理代碼下列代碼的功能是從源頁面中接收數據並通過相應組件顯示接收到的數據並清除創建的Session變量
private void Page_Load ( object sender System EventArgs e )
{
Label Text = Session [ name ] ToString ( ) ;
Label Text = Session [ email ] ToString ( ) ;
//從源頁面中接收數據顯示出來
Session Remove ( name ) ;
Session Remove ( email ) ;
//清除創建的Session的變量
// 在此處放置用戶代碼以初始化頁面
}
使用QueryString
把Visual Studio Net的當前窗口切換到WebForm頁面的代碼編輯窗口即WebFormaspxcs文件的編輯窗口用下列代碼替換WebFormaspxcs中的Button組件的Click事件對應的處理代碼下列代碼的功能是實現源頁面向目標頁面傳遞數據
private void Button_Click ( object sender System EventArgs e )
{
string sUrl;
//定義一個字符串此字符串中包含源頁面向目標傳遞的數據
sUrl = WebFormaspx?name= +
TextBox Text + &email= +
TextBox Text ;
//從源頁面中獲得傳遞的數據
Response Redirect ( sUrl ) ;
//向目標頁面傳遞數據
}
把Visual Studio Net的當前窗口切換到WebForm頁面的代碼編輯窗口即WebFormaspxcs文件的編輯窗口用下列代碼替換WebFormaspxcs中Page的Load事件對應的處理代碼下列代碼的功能是從源頁面中接收數據並通過相應組件顯示接收到的數據
private void Page_Load ( object sender System EventArgs e )
{
Label Text = Request QueryString [ name ] ;
//使用QueryString從源頁面中接收name變量數據並通過Label顯示
Label Text = Request QueryString [ email ] ;
//使用QueryString從源頁面中接收email變量數據並通過Label顯示
// 在此處放置用戶代碼以初始化頁面
}
總結起來就是QueryString相當簡單Session相對復雜QueryString安全性差Session安全性高QueryString可實現各Web頁面簡單數據傳遞一般就是字符串類型Session可實現各Web頁面間復雜類型數據的傳遞等等
在頁面之間傳遞值得過程中多處應用了超鏈接傳值的方式但是當傳遞的參數中含有中文字符時在調用RequestQueryString[]方法接收參數時總是出現錯誤而且錯誤的出現總是隨機的表現為接收的中文參數不全後加通配符?或者把中文參數後的那個參數和中文參數混在一起不加區分
在經過查閱資料之後發現調用方法ServerUrlEncode(string)可以解決問題string為要傳遞的中文字符串
From:http://tw.wingwit.com/Article/program/net/201311/13566.html