开发者社区> aehyok> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

C#页面之间跳转功能的小结

简介: 在两个ASP.NET页面之间传递值 引言   ASP.NET提供了卓越的事件驱动编程模型,让开发者简化了应用程序的总体设计,但是这个也造成了它固有的一些问题,例如,使用传统的ASP里,我们可以通过使用POST方法很容易地实现页面间传递值,同样的事情,在使用事件驱动编程模型的ASP.NET就不是那么容易了,当然了,我们仍然有一些方法可以实现同样的功能。
+关注继续查看

在两个ASP.NET页面之间传递值

引言   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

下面

private void Button1_Click (object sender, System.EventArgs e) 
{ 
          string url; 
          url="anotherwebform.aspx?name=" + TextBox1.Text + "&email=" + TextBox2.Text;          
          Response.Redirect(url); 
 } 

  目标页面代码:

private void Page_Load (object sender, System.EventArgs e)
 {
               Label1.Text=Request.QueryString["name"]; 
               Label2.Text=Request.QueryString["email"];
 }

  

的代码片断演示了如何实现这个方法:   源页面代码:

 使用Session变量   使用Session变量是可以在页面间传递值的的另一种方式,在本例中我们把控件中的值存在Session变量中,然后在另一个页面中使用它,以不同页面间实现值传递的目的。但是,需要注意的是在Session变量存储过多的数据会消耗比较多的服务器资源,在使用session时应该慎重,当然了,我们也应该使用一些清理动作来去除一些不需要的session来降低资源的无谓消耗。使用Session变量传递值的一般步骤如下:

1,在页面里添加必要的控件

2,创建可以返回表单的按钮和链接按钮

3,在按钮或链接按钮的单击事件里,把控件的值添加到session变量里

4,使用Response.Redirect方法重定向到另一个页面

5,在另一个页面提取session的值,在确定不需要使用该session时,要显式清除它 下面的代码片断演示了如何实现这个方法:

   源页面代码:

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"); 
}  

  

目标页面代码:

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"); 
}

  

Server.Transfer   这个方法相比上面介绍的方法稍微复杂一点,但在页面间值传递中却是特别有用的,使用该方法你可以在另一个页面以对象属性的方式来存取显露的值,当然了,使用这种方法,你需要额外写一些代码以创建一些属性以便可以在另一个页面访问它,但是,这个方式带来的好处也是显而易见的。总体来说,使用这种方法是简洁的同时又是面向对象的。使用这种方法的整个过程如下:

1,在页面里添加必要的控件

2,创建返回值的Get属性过程

3,创建可以返回表单的按钮和链接按钮

4,在按钮单击事件处理程序中调用Server.Transfer方法转移到指定的页面

5,在第二个页面中,我们就可以使用Context.Handler属性来获得前一个页面实例对象的引用,通过它,就可以使用存取前一个页面的控件的值了 以下代码综合实现上述步骤过程的代码:  

源页面代码:     把以下的代码添加到页面中

public string Name { get { return TextBox1.Text; } }

public string EMail { get { return TextBox2.Text; } }   

  

然后调用Server.Transfer方法

private void Button1_Click (object sender, System.EventArgs e) { Server.Transfer("anotherwebform.aspx"); } 

  

    目标页面代码:

在anotherwebform.aspx中务必在第一句话添加

<%@ Reference Page="~/GCSetting.aspx" %>

然后在anotherwebform.aspx.cs中添加如下。

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;
}

  

 

 

 

补充:

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" OnClick="Button1_Click" 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" OnClick="Button1_Click" 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)
    {
      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" OnClick="Button1_Click" Text="打开新窗口或者新 Tab " />
</form>
</body>
</html>

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属性。

 

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
62.8万亿位!一个源自高中生的算法「y-cruncher」让圆周率的精度再破世界纪录
近日,瑞士格劳宾登应用科学大学团队历时101天9小时,完成了圆周率小数点后62.8万亿位的计算,比创下吉尼斯纪录耗费的计算时间减少一半!诞生如此多位小数的算法「y-cruncher」竟出自高中生之手。
75 0
页面跳转的几种用法区别
一. my.navigateTo: 保留当前页面,跳转到应用内的某个页面,路径后可带参数;使用 abridge.navigateBack 可以返回到原页面; 示例代码:  my.navigateTo({ url: 'test?id=1' })  二.
456 0
从在浏览器中输入URL到页面渲染出来的完整过程是怎样的?
域名解析、建立连接、发送请求、响应数据、关闭连接
1971 0
js页面跳转整理
总结一:js页面跳转1.window.location.href 方式               window.location.href="target.aspx";     2.
557 0
swift UI专项训练42 用Swift代码实现页面跳转与传值
   之前我们做过如果要点击一个按钮实现跳转到另一个按钮的办法,有时候我们需要通过一些动作来触发页面的跳转,比如摇动手机,这样就不能直接用连线的办法来实现跳转了,那么如何通过代码的方式来实...
805 0
检测桌面浏览器的初步想法
必须指出,实际上并没有一种确切的方法可以判定终端是否一个桌面浏览器,但是,我们总是可以把多种条件的组合一起去检查,进而来综合判断出,对方终端是否一个非移动类型的终端。这里尝试列出几点: ua 字符串没有返回 Android/iPhone/WinPhone 等特征的,很可能是桌面浏览器; window.screenX 该值返回浏览器窗体左上角在屏幕的坐标位置。
582 0
页面跳转方法总结大全
最近刚刚完成手中的项目,比较闲。来这儿转转,把积累的一些技巧分享给大家! 1、关于PHP重定向 方法一:header("Location: index.php"); 方法二:echo "window.
623 0
页面延时跳转
Response.Write("window.setTimeout(\"window.location='test.aspx'\",5000);");     实现延时5秒后跳转
501 0
+关注
aehyok
踏踏实实的做技术,信自己没有什么不可以。
278
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载