引言 ASP.NET提供了卓越的事件驱动编程模型,让开发者简化了应用程序的总体设计,但是这个也造成了它固有的一些问题,例如,使用传统的ASP里,我们可以通过使用POST方法很容易地实现页面间传递值,同样的事情,在使用事件驱动编程模型的ASP.NET就不是那么容易了,当然了,我们仍然有一些方法可以实现同样的功能。本文将试着使用不同的可能的方法来解决这个问题,但可以预见是,本文将包含使用querystring,session变量以及server.Transfer方法来实现页面间的值传递。
使用QueryString 使用QuerySting在页面间传递值已经是一种很老的机制了,这种方法的主要优点是实现起来非常简单,然而它的缺点是传递的值是会显示在浏览器的地址栏上的(不安全),同时又不能传递对象,但是在传递的值少而安全性要求不高的情况下,这个方法还是一个不错的方案。使用这种方法的步骤如下:
1,使用控件创建web表单(form)
2,创建可以返回表单的按钮和链接按钮
3,在按钮或链接按钮的单击事件里创建一个保存URL的字符变量
4,在保存的URL里添加QueryString参数
5,使用Response.Redirect重定向到上面保存的URL
下面
复制代码 代码如下:
<STRONG>private void Button1_Click (object sender, System.EventArgs e)
{
string url;
url="anotherwebform.aspx?name=" + TextBox1.Text + "&email=" + TextBox2.Text;
Response.Redirect(url);
}
</STRONG>
目标页面代码:
复制代码 代码如下:
<STRONG>private void Page_Load (object sender, System.EventArgs e)
{
Label1.Text=Request.QueryString["name"];
Label2.Text=Request.QueryString["email"];
}
</STRONG>
的代码片断演示了如何实现这个方法: 源页面代码:
使用Session变量 使用Session变量是可以在页面间传递值的的另一种方式,在本例中我们把控件中的值存在Session变量中,然后在另一个页面中使用它,以不同页面间实现值传递的目的。但是,需要注意的是在Session变量存储过多的数据会消耗比较多的服务器资源,在使用session时应该慎重,当然了,我们也应该使用一些清理动作来去除一些不需要的session来降低资源的无谓消耗。使用Session变量传递值的一般步骤如下:
1,在页面里添加必要的控件
2,创建可以返回表单的按钮和链接按钮
3,在按钮或链接按钮的单击事件里,把控件的值添加到session变量里
4,使用Response.Redirect方法重定向到另一个页面
5,在另一个页面提取session的值,在确定不需要使用该session时,要显式清除它 下面的代码片断演示了如何实现这个方法:
源页面代码:
复制代码 代码如下:
<STRONG>private void Button1_Click (object sender, System.EventArgs e)
{
//textbox1 and textbox2 are webform
//controls
Session["name"]=TextBox1.Text;
Session["email"]=TextBox2.Text;
Server.Transfer("anotherwebform.aspx");
}
</STRONG>
目标页面代码:
复制代码 代码如下:
<STRONG>private void Page_Load (object sender, System.EventArgs e)
{
Label1.Text=Session["name"].ToString();
Label2.Text=Session["email"].ToString();
Session.Remove("name");
Session.Remove("email");
}
</STRONG>
Server.Transfer 这个方法相比上面介绍的方法稍微复杂一点,但在页面间值传递中却是特别有用的,使用该方法你可以在另一个页面以对象属性的方式来存取显露的值,当然了,使用这种方法,你需要额外写一些代码以创建一些属性以便可以在另一个页面访问它,但是,这个方式带来的好处也是显而易见的。总体来说,使用这种方法是简洁的同时又是面向对象的。使用这种方法的整个过程如下:
1,在页面里添加必要的控件
2,创建返回值的Get属性过程
3,创建可以返回表单的按钮和链接按钮
4,在按钮单击事件处理程序中调用Server.Transfer方法转移到指定的页面
5,在第二个页面中,我们就可以使用Context.Handler属性来获得前一个页面实例对象的引用,通过它,就可以使用存取前一个页面的控件的值了 以下代码综合实现上述步骤过程的代码:
源页面代码: 把以下的代码添加到页面中
复制代码 代码如下:
<STRONG>public string Name { get { return TextBox1.Text; } }
public string EMail { get { return TextBox2.Text; } }
</STRONG>
然后调用Server.Transfer方法
复制代码 代码如下:
<STRONG>private void Button1_Click (object sender, System.EventArgs e) { Server.Transfer("anotherwebform.aspx"); }
</STRONG>
目标页面代码:
在anotherwebform.aspx中务必在第一句话添加
复制代码 代码如下:
<%@ Reference Page="~/GCSetting.aspx" %>
然后在anotherwebform.aspx.cs中添加如下。
复制代码 代码如下:
<STRONG>private void Page_Load(object sender, System.EventArgs e)
{
//create instance of source web form
WebForm1 wf1;
//get reference to current handler instance
wf1=(WebForm1)Context.Handler;
Label1.Text=wf1.Name;
Label2.Text=wf1.EMail;
}
</STRONG>
补充:
Response.Redirect 实现页面跳转
功能:重定向当前客户端浏览器连接到另一个URL页面。
语法: Response.Redirect("字符串")
说明:字符串是网页URL,可以是绝对路径或相对路径。
也可以换用其重载方法Response.Redirect(“字符串”, false),若设置为true则当页面代码全部执行完毕或调用Flush或End方法后,服务器才将页面执行结果发送给客户端,否则服务器边执行边发送。ASP3.0以上版本默认值为true;Windows2000的IIS5中默认值也为true。
Response.Redirect这个跳转页面的方法跳转速度不快,因为它要走两次回发(postback)。它可以跳转到任何页面,没有站点页面限制(可以由baidu跳转到google),但是不能跳过登录保护。速度慢是其最大的缺陷。
其跳转机制为:首先是服务器端发送一个http请求到客户端,通知需要跳转到的新页面,然后客户端再发送跳转请求到服务器端。需要注意的是跳转后内部空间保存的所有数据信息将会丢失,所以需要用到Session.
2.Response.Redirect 打开新窗口的两种方法
一般情况下,Response.Redirect 方法是在服务器端进行转向,因此除使用 Response.Write("<script>window.location='http://dotnet.aspx.cc';</script>") 方法外,其他方法暂不能在新窗口打开所指定的 URL 地址的。
但是可以通过设置 form 元素的 target 属性,还是有办法打开新窗口的。下面就是可以采用的两种方法。
方法一:在服务器端设置 target 属性,这个方法也非常适用于客户端不支持脚本的情况。代码如下:
复制代码 代码如下:
<%@ Page Language="C#" AutoEventWireup="true" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
form1.Target = "_blank";
}
protected void Button1_Click(object sender, EventArgs e)
{
Response.Redirect("http://dotnet.aspx.cc");
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title></title>
</head>
<body id="b" runat="server">
<form id="form1" runat="server">
<asp:Button ID="Button1" runat="server" Text="打开新窗口或者新 Tab " />
</form>
</body>
</html>
办法二:采用客户端脚本的方法设置 target 属性。代码如下:
复制代码 代码如下:
<%@ Page Language="C#" AutoEventWireup="true" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
Button1.Attributes.Add("onclick", "this.form.target='_newName'");
}
protected void Button1_Click(object sender, EventArgs e)
{
Response.Redirect("http://dotnet.aspx.cc");
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title></title>
</head>
<body id="b" runat="server">
<form id="form1" runat="server">
<asp:Button ID="Button1" runat="server" Text="打开新窗口或者新 Tab " />
</form>
</body>
</html>
上面两种方法中的 target 属性可以采用任何合法的名称,但要注意,如果相同名称的窗口已经打开,则新窗口会在已经存在名称的窗口里打开。
更新:如果需要设置弹出窗口的宽度和高度,可以修改为下面的方法:
复制代码 代码如下:
<STRONG><%@ Page Language="C#" AutoEventWireup="true" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
string WindowName = "win" + System.DateTime.Now.Ticks.ToString();
Page.RegisterOnSubmitStatement("js", "window.open('','" + WindowName + "','width=600,height=200')");
form1.Target = WindowName;
}
protected void Button1_Click(object sender, EventArgs e)
{
Response.Redirect("http://dotnet.aspx.cc");
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title></title>
</head>
<body id="b" runat="server">
<form id="form1" runat="server">
<asp:Button ID="Button1" runat="server" Text="打开新窗口或者新 Tab " />
</form>
</body>
</html>
</STRONG>
3. Server.Transfer 速度快,只需要一次postback,但它必须是在同一个站点内跳转。
Server.Transfer的重定向请求发生在服务器端,仅仅将此控件传递到新的网页并且不在客户端重新定位该网页,所以浏览器的url地址仍然是原页面的地址!另外,它能跳过登录保护。
默认情况下,Transfer方法不会把表单数据或查询字符串从一个页面传递到另一个页面,但是如果把该方法的第二个参数设置成true,就可以保留原先页面的表单数据和查询字符串。
Server.Transfer("hyj.aspx");
//服务器停止执行本页,保存本页的当前数据后,再使页面转向hyj.aspx,并将跳转之前数据加上hyj.aspx页面执行的结果返回给浏览器。
4.Server.Execute这个方法主要是用在页面设计上,它必须是在同一个站点内跳转,也只需要一次postback。 这个方法是需要将一个页面的输出结果插入到另一个aspx页面的时候使用,大部分是在表格中将某一个页面类似于嵌套的方式存在于另一页面。 Server.Execute("hyj.aspx");//服务器保存此页的当前数据后,使页面转向到hyj.aspx执行,在hyj.aspx执行之后又返回本页继续执行,再将三者结果合并后返回给浏览器。 Execute方法跳转类似于函数调用。 如何选择页面重定向的方法: asp.net中页面跳转方式----Redirect、Transfer、Execute、超链接、HyperLink控件。 当需要把用户跳转到另一台服务器上的页面的时候 ,使用Redirect 当需要把用户跳转到非aspx页面时候,如html,使用Redirect 需要把查询字符串作为url一部分传给服务器的时候,使用Redirect,因为其他两种方法不能做到2次postback,把数据带回服务器 需要aspx页面间的转换(不涉及登录),使用Transfer 当需要把aspx页面的输出结果插入到另一个aspx页面的时候使用 Execute。 当需要用户来决定什么时候跳转页面,就使用超链接。 要用程序来控制转换的目标,但转换的时机由用户决定,使用Web服务器的HyperLink控件,动态设置其NavigateUrl属性。