重點總結
目前為止在ASPNET網頁中傳遞數據的方式至少有種
通過查詢字符串傳遞數據
通過HTTP POST傳遞數據
通過會話狀態傳遞數據
通過源頁的公共屬性傳遞數據
通過源頁中的控件值傳遞數據
到底使用哪種方式來進行數據的傳遞這可能受到兩方面的影響
頁面重定向的方式
源頁和目標頁是否位於相同的ASPNET應用程序中
如果源頁和目標頁位於不同的ASPNET應用程序中則只能通過查詢字符串和HTTP POST傳遞數據
而如果源頁和目標頁位於相同的ASPNET應用程序中則可以使用五種方式中的任意一種
一通過查詢字符串傳遞數據
下面的兩個URL第一個只傳遞了產品編號第二個不僅傳遞了產品編號同時也傳遞產品名稱
x?ProductID=
x?ProductID=&ProductName=Glass
在目標頁中則可以通過PageRequestQueryString屬性來獲取查詢字符串中傳遞的鍵值比如下面的代碼
thisResponseWrite(thisRequestQueryString[ProductID]);
thisResponseWrite(<br />);
thisResponseWrite(stringFormat(ProductID={} ProductName={}
thisRequestQueryString[ProductID]
thisRequestQueryString[ProductName]));
二通過HTTP POST傳遞數據
此示例代碼在源頁中為用戶提供了輸入用戶名生日和年齡的文本框並且將Button控件的PostBackUrl屬性設置為DestinationPageaspx也就是說當單擊【提交到目標頁】按鈕後源頁窗體的數據會被傳遞到DestinationPageaspx頁面
在目標頁中則通過PageRequestForm屬性來獲取這些傳遞過來的數據
源頁的頁面源碼如下
<%@ Page Language=C# AutoEventWireup=true CodeFile=SourcePageaspxcs Inherits=SourcePage %>
<!DOCTYPE html PUBLIC //WC//DTD XHTML Transitional//EN
transitionaldtd>
<html xmlns=>
<head runat=server>
<title>源頁!</title>
</head>
<body>
<form id=form runat=server>
<div>
User Name :
<asp:TextBox ID=UserNameTextBox runat=server></asp:TextBox>
<br />
Birth Date :
<asp:TextBox ID=BirthDateTextBox runat=server></asp:TextBox>
<br />
Age :
<asp:TextBox ID=AgeTextBox runat=server></asp:TextBox>
<br />
<asp:Button ID=SubmitButton runat=server Text=提交到目標頁
PostBackUrl=~/DestinationPageaspx />
</div>
</form>
</body>
</html>
目標頁中獲取源頁窗體數據的代碼如下
protected void Page_Load(object sender EventArgs e)
{
StringBuilder SBuilder = new StringBuilder();
NameValueCollection PostedValues =
thisRequestForm;
for (int Index = ; Index < PostedValuesCount; Index++)
{
if (PostedValuesKeys[Index]Substring( ) != __)
{
SBuilderAppend(stringFormat({} = {}
PostedValuesKeys[Index]
PostedValues[Index]));
SBuilderAppend(<br />);
}
}
thisResponseWrite(SBuilderToString());
}
代碼中的if語句主要是為了避免獲取以兩個下劃線__開頭的隱藏字段的數據比如__VIEWSTATE__EVENTTARGET__EVENTARGUMENT當然也可以去掉這個if語句然後就能同時獲取這些隱藏字段的數據了
三通過會話狀態傳遞數據
使用會話狀態的好處是可以在與源頁處於相同ASPNET應用程序的所有網頁間共享數據缺點是會增加服務器的內存開銷
下面的代碼中用戶在源頁的【用戶名】文本框中輸入自己的姓名然後單擊【提交數據】按鈕服務器代碼會通過PageSession屬性將用戶名存儲到會話狀態中然後使用ResponseRedirect()方法將頁面強制重定向到另外一個頁面(DestinationPageaspx)在這個目標頁面中再次通過PageSession屬性來獲取用戶在源頁中保存的用戶名
源頁的源代碼如下
<%@ Page Language=C# AutoEventWireup=true CodeFile=SourcePageaspxcs Inherits=SourcePage %>
<!DOCTYPE html PUBLIC //WC//DTD XHTML Transitional//EN
transitionaldtd>
<html xmlns=>
<head runat=server>
<title>源頁通過會話狀態傳遞數據!</title>
</head>
<body>
<form id=form runat=server>
<div>
用戶名
<asp:TextBox ID=UserNameTextBox runat=server></asp:TextBox>
<asp:Button ID=SubmitButton runat=server Text=提交數據
onclick=SubmitButton_Click />
</div>
</form>
</body>
</html>
源頁中用來保存用戶名到會話狀態並重定向到目標頁的代碼如下
protected void SubmitButton_Click(object sender EventArgs e)
{
thisSession[UserName] = thisUserNameTextBoxText;
thisResponseRedirect(DestinationPageaspx);
}
目標頁中獲取保存在會話狀態中的用戶名的代碼如下
protected void Page_Load(object sender EventArgs e)
{
string UserName = thisSession[UserName]ToString();
thisResponseWrite(UserName);
}
四通過源頁的公共屬性傳遞數據
在示例代碼中我們在源頁中提供了一個輸入用戶名的文本框然後通過單擊【提交到目標頁】按鈕將數據提交到目標頁
源頁的源代碼如下
<%@ Page Language=C# AutoEventWireup=true CodeFile=SourcePageaspxcs Inherits=SourcePage %>
<!DOCTYPE html PUBLIC //WC//DTD XHTML Transitional//EN
transitionaldtd>
<html xmlns=>
<head runat=server>
<title>源頁通過公共屬性傳遞數據!</title>
</head>
<body>
<form id=form runat=server>
<div>
用戶名<asp:TextBox ID=UserNameTextBox runat=server></asp:TextBox>
<br />
<asp:Button ID=SubmitButton runat=server Text=提交到目標頁
PostBackUrl=~/DestinationPageaspx />
</div>
</form>
</body>
</html>
並且為源頁定義了一個名為UserName的公共屬性此屬性返回的是【用戶名】文本框中輸入的用戶名
public string UserName
{
get { return thisUserNameTextBoxText; }
}
這樣我們就創建了一個包含公共屬性的源頁接著創建目標頁並且為目標頁添加@PreviousPageType指令當然也可以使用@Reference指令
<%@ PreviousPageType VirtualPath=~/SourcePageaspx %>
這樣ASPNET就會自動將目標頁的PagePreviousPage屬性轉換為源頁的類型從而就可以直接訪問UserName屬性注意觀察下面的代碼我們並沒有將PagePreviousPage進行顯示的類型轉換
if (thisPreviousPage != null)
{
string UserName = thisPreviousPageUserName;
thisResponseWrite(UserName);
}
需要特別強調的是不要忘記判斷PagePreviousPage屬性是否為null因為它確實有為null的可能性如果在為null的情況下獲取UserName這個源頁的公共屬性那是會跳出異常的
五通過源頁中的控件值傳遞數據
這最後一種傳遞數據的方式就是直接獲取源頁的控件對象了然後通過控件的屬性值來獲取所需的數據比如本示例代碼中我們就是通過獲取源頁的TextBox控件然後通過訪問TextBoxText屬性來獲取用戶在源頁中輸入的數據
下面的示例代碼中我們在源頁放置了一個輸入用戶名的文本框ID為UserNameTextBox通過PagePreviousPageFindControl()方法就可以獲取此控件的引用
源頁的源代碼如下
<%@ Page Language=C# AutoEventWireup=true CodeFile=SourcePageaspxcs Inherits=SourcePage %>
<!DOCTYPE html PUBLIC //WC//DTD XHTML Transitional//EN
transitionaldtd>
<html xmlns=>
<head runat=server>
<title>源頁通過控件屬性傳遞數據!</title>
</head>
<body>
<form id=form runat=server>
<div>
用戶名<asp:TextBox ID=UserNameTextBox runat=server></asp:TextBox>
<br />
<asp:Button ID=SubmitButton runat=server Text=提交到目標頁
PostBackUrl=~/DestinationPageaspx />
</div>
</form>
</body>
</html>
目標頁中獲取文本框控件並獲取其Text屬性值的代碼如下
if (thisPreviousPage != null)
{
TextBox UserNameTextBox =
(TextBox)thisPreviousPageFindControl(UserNameTextBox);
if (UserNameTextBox != null)
{
thisResponseWrite(UserNameTextBoxText);
}
}
如果所要獲取的控件位於某個控件的內部比如下面的代碼UserNameTextBox控件位於名為UserPanel的Panel控件內部那麼首先找出這個Panel控件然後通過此控件的FindControl()方法找出內部的文本框控件
源頁的源代碼如下
<%@ Page Language=C# AutoEventWireup=true CodeFile=SourcePageaspxcs Inherits=SourcePage %>
<!DOCTYPE html PUBLIC //WC//DTD XHTML Transitional//EN
transitionaldtd>
<html xmlns=>
<head runat=server>
<title>源頁通過控件屬性傳遞數據!</title>
</head>
<body>
<form id=form runat=server>
<div>
<asp:Panel ID=UserPanel runat=server>
用戶名<asp:TextBox ID=UserNameTextBoxInPanel runat=server></asp:TextBox>
<br />
<asp:Button ID=SubmitButtonInPanel runat=server Text=提交到目標頁
PostBackUrl=~/DestinationPageaspx />
</asp:Panel>
</div>
</form>
</body>
</html>
目標頁中獲取這個位於Panel控件內部的TextBox控件的代碼如下
if (thisPreviousPage != null)
{
Panel UserPanel = (Panel)thisPreviousPageFindControl(UserPanel);
if (UserPanel != null)
{
TextBox UserNameTextBox =
(TextBox)UserPanelFindControl(UserNameTextBoxInPanel);
if (UserNameTextBox != null)
{
thisResponseWrite(UserNameTextBoxText);
}
}
}
不管控件位於那個級別的命名容器控件內部都是通過這種方式來獲取的
一定不要忘記判斷所獲取的控件引用是否為null
到這裡為止種在網頁間傳遞數據的方式基本已經展示完畢!
From:http://tw.wingwit.com/Article/program/net/201311/12681.html