ASPNETWEBFORMS给开发者提供了极好的事件驱动开发模式然而这种简单的应用程序开发模式却给我们带来了一些小问题举个例子在传统的ASP应用程序中你能够通过POST方法很容易的把一个值或多个值从一个页面传送到另一个页面用同样的方法在ASPNET中实现有点麻烦在这里我们可以通过其他方式来解决这种情形ASPNET为我们提供了三种方式一种是可以通过用QueryString来传送相应的值再一种是通过session变量来传送相应的值还有就是通过ServerTransfer方法来实现下面分别一一介绍
一使用Querystring
Querystring是一种非常简单的传值方式其缺点就是会把要传送的值显示在浏览器的地址栏中并且在此方法中不能够传递对象如果你想传递一个安全性不是那么太重要或者是一个简单的数值时用此方法最好不过了下面通过一个小例子来完成传值工作步骤如下
创建一个webform
在新建的webform中放置一个button在放置两个TextBoxTextBox
为button按钮创建click事件
代码如下
privatevoidButton_Click
(objectsenderSystemEventArgse)
{
stringurl;
url=webformaspx?name=+
TextBoxText+&email=+
TextBoxText;
ResponseRedirect(url);
}
新建一个目标页面命名为webform
在webform中放置两个LabelLabel
在webform的Page_Load中添加如下代码
privatevoidPage_Load
(objectsenderSystemEventArgse)
{
LabelText=RequestQueryString[name];
LabelText=RequestQueryString[email];
}
运行即可看到传递后的结果了
二使用Session变量
使用Session变量传值是一种最常见的方式了此中方式不仅可以把值传递到下一个页面还可以交叉传递到多个页面直至把Session变量的值removed后变量才会消失举个例子看看
创建一个webform
在新建的webform中放置一个button在放置两个TextBoxTextBox
为button按钮创建click事件
代码如下
privatevoidButton_Click
(objectsenderSystemEventArgse)
{
Session[name]=TextBoxText;
Session[email]=TextBoxText;
ResponseRedirect(webformaspx);
}
新建一个目标页面命名为webform
在webform中放置两个LabelLabel
在webform的Page_Load中添加如下代码
privatevoidPage_Load
(objectsenderSystemEventArgse)
{
LabelText=Session[name]ToString();
LabelText=Session[email]ToString();
SessionRemove(name);
SessionRemove(email);
}
运行即可看到传递后的结果了
三使用ServerTransfer
虽然这种方法有点复杂但也不失为一种在页面传值的方式
举个例子看看
创建一个webform
在新建的webform中放置一个button在放置两个TextBoxTextBox
为button按钮创建click事件
代码如下
privatevoidButton_Click
(objectsenderSystemEventArgse)
{
ServerTransfer(webformaspx);
}
创建过程来返回TextBoxTextBox控件的值代码如下
publicstringName
{
get
{
returnTextBoxText;
}
}
publicstringEMail
{
get
{
returnTextBoxText;
}
}
新建一个目标页面命名为webform
在webform中放置两个LabelLabel
在webform的Page_Load中添加如下代码
privatevoidPage_Load
(objectsenderSystemEventArgse)
{
//创建原始窗体的实例
WebFormwf;
//获得实例化的句柄
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为要传递的中文字符串