重点总结
目前为止在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
到这里为止种在网页间传递数据的方式基本已经展示完毕!