Asp.net页面之间传递参数的几种方法

2023-11-07

1. 使用QueryString变量
    QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中。如果是传递一个或多个安全性要求不高或是结构简单的数值时,可以使用这个方法。但是对于传递数组或对象的话,就不能用这个方法了。

 

下面是一个例子:
a.aspx的C#代码
private void Button1_Click(object sender, System.EventArgs e)
{
string s_url;
s_url = "b.aspx?name=" + Label1.Text;
Response.Redirect(s_url);
}

b.aspx中C#代码
private void Page_Load(object sender, EventArgs e)
{
Label2.Text = Request.QueryString["name"];
}

 

优点:1.使用简单,对于安全性要求不高时传递数字或是文本值非常有效。

缺点:1.缺乏安全性,由于它的值暴露在浏览器的URL地址中的。

      2.不能传递对象。

可能出现的问题:

1.在处理Resonse.QueryString函数汉字参数传递时,发生不能完整传递参数的具体值的错误,解决有两个方法:
方法一:需要重新设置Web.config中的encoding和全球化设置。
1、首行:<?xml version="1.0" encoding="utf-8" ?>
更改为:<?xml version="1.0" encoding="GB2312" ?>

2、<!-- 全球化此节设置应用程序的全球化设置。--><globalizationrequestEncoding="utf- 8"responseEncoding="utf-8"/>更改为:<!-- 全球化此节设置应用程序的全球化设置。 --><globalizationrequestEncoding="GB2312"responseEncoding="GB2312"/>
方法二:使用Server.UrlEncode和Server.UrlDecode对汉字或者特殊字符进行编码和解码。

      
2. 使用Application 对象变量
    Application对象的作用范围是整个全局,也就是说对所有用户都有效。其常用的方法用Lock和UnLock。

    Application变量在整个应用程序生命周期中都是有效的,类似于使用全局变量一样,所以可以在不同页面中对它进行存取。它和Session变量的 区别在于,前者是所有的用户共用的全局变量,后者是各个用户独有的全局变量。举个例子来解释:网站访问的计数器变量一般采用Application变量, 多个请求访问时共享这一个变量,均可对它进行操作,该变量可以被整个应用程序的各个页面直接使用。用户登陆的帐号名一般采用Session变量,多个请求访问时有各自的Session变量,只能对自己的该Session变量进行操作,整个应用程序的各个页面直接使用这个变量来获得用户的基本信息。

a.aspx的C#代码
private void Button1_Click(object sender, System.EventArgs e)
{
Application["name"] = Label1.Text;
Server.Transfer("b.aspx");
}

b.aspx中C#代码
private void Page_Load(object sender, EventArgs e)
{
string name;
Application.Lock();
name = Application["name"].ToString();
Application.UnLock();
}
优点:1.使用简单,消耗较少的服务器资源。

     2.不仅能传递简单数据,还能传递对象。

      3.数据量大小是不限制的。
缺点:
1.作为全局变量容易被误操作。

3. 使用Session变量
    想必这个肯定是大家使用中最常见的用法了,其操作与Application类似,作用于用户个人,所以,过量的存储会导致服务器内存资源的耗尽。
a.aspx的C#代码
private void Button1_Click(object sender, System.EventArgs e)
{
Session["name"] = Label.Text;
}

b.aspx中C#代码
private void Page_Load(object sender, EventArgs e)
{
string name;
name = Session["name"].ToString();

优点:1.使用简单,不仅能传递简单数据类型,还能传递对象。2.数据量大小是不限制的。
缺点:
1.在Session变量存储大量的数据会消耗较多的服务器资源。

4. 使用Cookie对象变量
    这个也是大家常使用的方法,与Session一样,其是什对每一个用户而言的,但是有个本质的区别,即Cookie是存放在客户端的,而session是存放在服务器端的。而且Cookie的使用要配合ASP.NET内置对象Request来使用。
        cookie用于在用户浏览器上存储小块的信息,保存用户的相关信息,比如用户访问某网站时用户的ID,用户的偏好等,用户下次访问就可以通过检索获得以 前的信息。所以Cookie也可以在页面间传递值。Cookie通过HTTP头在浏览器和服务器之间来回传递的。Cookie只能包含字符串的值,如果想 在Cookie存储整数值,那么需要先转换为字符串的形式。可以通过遍历Request对象的Cookie集合可以获得所有的浏览器所有的Cookie。
a.aspx的C#代码
private void Button1_Click(object sender, System.EventArgs e)
{
HttpCookie cookie_name = new HttpCookie("name");
cookie_name.Value = Label1.Text;
Reponse.AppendCookie(cookie_name);
Server.Transfer("b.aspx");
}

b.aspx中C#代码
private void Page_Load(object sender, EventArgs e)
{
string name;
name = Request.Cookie["name"].Value.ToString();
}

例2

 Src.aspx: Response.Cookies[“id”].Value=TextBox1.Text; Response.Redirect(“Dst.aspx”);

 Dst.aspx: Label1.Text=Request.Cookies[“id”].Value;


//清除Cookie 变量
Response.Cookies[“id”].Expires=Now.AddDays(-1);

//清除当前域名(和路径)下的所有Cookie
Response.Cookies[cookie].Expires=Now.AddDays(-1);

 
优点:1.直接在服务器端重定向,使用简单方便,减少了客户端对服务器端提出请求。2.可以传递各种数据类型的值和控件的值。
缺点:
1.客户端浏览器中的URL地址是不改变,会导致在新的页面可能出现一些意想不到的问题。比如如果源页面和目的页面不在同一个虚拟目录或其子目录下,那么使用相对路径的图片、超链接都会导致错误的指向。

5. 使用Server.Transfer方法
    这个才可以说是面象对象开发所使用的方法,其使用Server.Transfer方法把流程从当前页面引导到另一个页面中,新的页面使用前一个页面的应答流,所以这个方法是完全面象对象的,简洁有效。

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

   使用这种方法的整个过程如下:

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

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

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

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

  5.在第二个页面中,我们就可以使用Context.Handler属性来获得前一个页面实例对象的引用,通过它,就可以使用存取前一个页面的控件的值了


Transfer传参例题
a.aspx的C#代码
public string Name
{
get{ return Label1.Text;}
}
private void Button1_Click(object sender, System.EventArgs e)
{
Server.Transfer("b.aspx");
}

b.aspx中C#代码
private void Page_Load(object sender, EventArgs e)
{
WebForm1 newWeb; //create instance of source web form

newWeb = (WebForm1)Context.Handler;
string name;
name = newWeb.Name;
}

MicrosoftInternetExplorer402DocumentNotSpecified7.8Normal0

send.aspx:  
        public string Name  
        {      
            get 
            {    
              return "honge";    
            }   
        }    
        protected void Button1_Click(object sender, EventArgs e)
        {     
           Server.Transfer("Default2.aspx");
        }

    receive.aspx:   
        send d = Context.Handler as send ;   
        if (d != null)   
        {        
            Response.Write(d.Name);这样可以得到参数值。
        }


如果在asp.net 2.0中还可以这样用:
通过PreviousPage
    PreviousPage d = Context.Handler as PreviousPage ;
    if (d != null)   
    {        
         Response.Write(d.Name);这样可以得到参数值。  
    }

也可以这样用:
send.aspx:
<asp:Button ID="btnSubmit" runat="server" PostBackUrl="~/reveive.aspx" Text="Submit" />

receive.aspx:
<%@ PreviousPageType VirtualPath="~/Default.aspx" %>
string name = PreviousPage.Name;
这样可以得到参数值。

如果你的页面中用到了MasterPage的话 Server.Transfer 传递的 PreviousPage就无效了,不知道这是什么原因.
所以在用到MasterPage的话,最好用Session或是Context.Items["username"]来实现.

6、viewState["UserName"]传递,只能在当前页面之内传递。


分析

使用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) 
        { 
            file://textbox1 and textbox2 are webform  
            file://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"); 
}
  
目标页面代码:  
    private void Page_Load  (object sender, System.EventArgs e) 
    {  
        file://create instance of source web form 
        WebForm1 wf1;  
        file://get reference to current handler instance 
        wf1=(WebForm1)Context.Handler;  
        Label1.Text=wf1.Name;  
        Label2.Text=wf1.EMail; 
    }
总结
  本文讲述了使用不同的方法实现了ASP.NET页面间值传递,这三种方法是:QueryString,SessionServer.Transfer
我们应该反覆体会几种方法的异同。

转载于:https://www.cnblogs.com/nm125419/archive/2012/11/23/2784977.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Asp.net页面之间传递参数的几种方法 的相关文章

随机推荐

  • gtest在使用中出现错误:error: undefined reference to ‘testing::internal::EqFailure(char const*, char const*,

    如题 业务需要编写了一个C的API库 顺带写了一个gtest测试用例 但是编译的时候出现题目中的错误 折腾了半天以为是gtest的问题 结果发现是自己CMakelist txt的问题 因为Gtest支持的最低版本是Cxx 14版本 所以只要
  • TCP/IP协议二十一:HTTPS/SSL协议详解(1)加密原理

    TCP IP协议二十一 HTTPS SSL协议详解 1 加密原理 1 加密历史 对称加密算法 1 1 加密 1 2 密钥 1 3 对称加密算法 2 非对称加密算法 2 1 RSA算法 2 1 1 RSA 非对称加密原理 2 1 2 RSA通
  • Rust 近乎宗教般信仰的案例

    Rust 近乎宗教般信仰的案例 亚历山大 西多罗夫 众所周知 Rust 社区对 Rust 非常热情 有些人甚至责怪我们偶尔表现得像一个邪教 恐怕我不会打消这个印象 因为在这篇文章将证明 Rust 使您成为一个更好的工程师 更好的管理者和更好
  • 学习JavaScript必须知道的10个难点,你都知道吗?

    立即执行函数 立即执行函数 即Immediately Invoked Function Expression IIFE 正如它的名字 就是创建函数的同时立即执行 它没有绑定任何事件 也无需等待任何异步操作 function 代码 funct
  • Redmi4X刷入Ubuntu touch真正成为一台远程无需人操作的云服务器(就是配置垃圾)

    前言 前几天把高一买的手机相册和文件拷贝到了电脑上 寻思这旧手机还能干嘛 搜了一下有做监控的 行车记录仪的 最后决定还是做Linux服务器香啊 用了一天时间参考网上的教程做完了 自己再做一下总结和一些弯路记录 因为是米粉所以不得不说小米牛逼
  • 科研不是比赛,而是一种对未知和完美的自我追求——跟邢波(Eric Xing)面对面聊科研

    编者按 6月26日 2014年国际机器学习大会 ICML 在北京国际会议中心完美落幕 作为机器学习领域两大顶尖年会之一 这是 ICML大会30多年来首次来到中国和远东 在国内的机器学习界震动不小 身为本次大会主席的卡耐基梅隆大学计算机系教授
  • MySQL为什么选择使用B+树作为索引的数据结构

    看完到某大佬写的关于mysql索引的数据结构的文章 文章写的非常详细 在这里总结一下 首先 索引的特点是查询快 排序 那么首先就会想到树 1 二叉查找树 Binary Search Tree BST 二叉查找树是一种支持快速查找的数据结构
  • 注册AppStore开发者账号以及收款设置的流程详解(2019最新版)

    最近和朋友倒腾了一个APP 想在App Store上架 因此就在注册个人开发者账号的过程中踩了不少坑 申请App Store的开发者账号果然不是一件容易的事情 并且我发现在设置收款时尤其容易踩坑 期间 我也看了不少分享 但由于苹果对申请流程
  • Owl Eyes: Spotting UI Display Issues via Visual Understanding

    2020年ASE的一篇文章 ASE 全称 IEEE ACM International Conference on Automated Software Engineering 是软件工程领域的顶级会议 标题 通过视觉理解发现UI显示问题
  • CTF学习笔记——Include&Ping Ping Ping

    一 ACTF2020 新生赛 Include 1 题目 2 解题步骤 点进去看了一下 根据题目猜测 应该是和php的文件包含漏洞有关 尝试了一下显示phpinfo 意料之中的失败了 看wp才了解到 这是一道伪协议的题目 然后翻了一下之前的博
  • layui如何动态上传文件

    HTML div class layui form item od customer src div
  • csu 1811 Tree Intersection 2016湖南省赛 I

    Problem acm csu edu cn csuoj problemset problem pid 1811 vjudge net contest 161962 problem I Reference blog csdn net qwb
  • Android 计时器Chronometer 使用及源码分析,常见移动app开发框架

    主界面布局文件 仅保留Chronometer相关布局
  • 基于协同过滤的用户推荐的java例子

    基于协同过滤的用户推荐的java例子 基于用户的协同过滤推荐算法 1 基于用户的协同过滤推荐算法 2 基于用户的协同过滤推荐算法通过寻找与目标用户具有相似评分的邻居用户 通过查找邻居用户喜欢的项目 推测目标用户也具有相同的喜好 基于用户的协
  • Linux环境下如何杀死僵尸进程

    我们在使用top命令查看主机性能的的时候会在第二行会查看到有zombie关键字 此关键字代表僵尸进程的意思 僵尸进程 当进程退出时 它向父进程发送一个SIGCHLD信号 默认情况下总是忽略SIGCHLD信号 此时进程状态一直保留在内存中 直
  • K8S 学习四(POD详解)

    POD结构 每个pod中都可以包含一个或者多个容器 这些容器可以分为两类 1 用户程序所在的容器 数量可多可少 上图的第一 第二层 2 Pause容器 这是每个pod都会有的一个根容器 它的作用有两个 2 1 可以以它为依据 评估整个Pod
  • cas单点登录-自定义登录验证(四)

    我们在使用SSO单点登录的时候不只是验证一下用户名和密码是否一致 有时候还需要验证一些别的校验 那么这一张讲一下如何自定义验证器 自定义验证很重要 因为我们后续的很多功能 都是基于自定义验证 CAS服务器的org apereo cas au
  • 在浏览器地址栏键入URL按下回车之后会经历什么?

    在浏览器地址栏键入URL按下回车之后主要会经历以下7个步骤 1 查找浏览器缓存 如果查找到缓存中有我们URL对应的文件 则判断是否命中强缓存 如果命中直接读取使用即可 如果强缓存没有命中 判断协商缓存是否命中 但协商缓存不论是否命中都会发送
  • es部署--生产环境--01--es单机

    es部署 生产环境 01 es单机 前提 使用hd用户登陆 完成基础环境搭建 https blog csdn net zhou920786312 article details 118212302 1 资源下载 elasticsearch
  • Asp.net页面之间传递参数的几种方法

    1 使用QueryString变量 QueryString是一种非常简单的传值方式 他可以将传送的值显示在浏览器的地址栏中 如果是传递一个或多个安全性要求不高或是结构简单的数值时 可以使用这个方法 但是对于传递数组或对象的话 就不能用这个方