• [网络收集]在两个ASP.NET页面之间传递变量 (QueryString,Session和Cookies Application)


    ASP.NET状态管理之一(概括篇)


    摘自:http://www.cnblogs.com/aierong/archive/2004/07/14/23950.html

    ASP.NET提供了事件驱动编程模型,使开发者简化了应用程序的总体设计,但是这个也造成了它固有的一些问题,例如,在传统的ASP里,我们可以通过使用POST方法很容易地实现页面间传递变量,同样的事情,在使用事件驱动编程模型的ASP.NET就要麻烦一些,但是我们仍然有一些方法可以实现同样的功能。笔者在这里将包含使用querystring,session变量以及server.Transfer方法来实现页面间的变量传递。

    使用QueryString
    使用QuerySting在页面间传递值已经是一种很老的机制了,这种方法的主要优点是实现起来非常简单,然而它的缺点是传递的值是会显示在浏览器的地址栏上的(不安全),同时又不能传递对象,但是在很多传递的值少而安全性要求不高的情况下,这个方法还是较多地被首选使用。

    使用这种方法包括如下的步骤:
    a,使用控件创建web表单(form)
    b,创建可以返回表单的按钮和链接按钮
    c,在按钮或链接按钮的单击事件里创建一个保存URL的字符变量
    d,在保存的URL里添加QueryString参数
    e,使用Response.Redirect重定向到上面保存的URL
    下面的代码片断演示了如何实现这个方法:
    源页面代码:
    private void Button1_Click
    (object sender, System.EventArgs e)
    {
    string url;
    url="webform1.aspx?var1=" + TextBox1.Text + "&var2=" + TextBox2.Text;
    Response.Redirect(url);
    }
    目标页面代码:
    private void Page_Load
    (object sender, System.EventArgs e)
    {
    Label1.Text=Request.QueryString["var1"];

    // Label1.Text=Request.QueryString["var1"] 也可以直写为 Label1.Text=Request["var1"]下面的语句也是一样可以简写
    Label2.Text=Request.QueryString["var2"];
    }
    使用Session变量
    使用Session变量是可以在页面间传递值的的另一种方式,在本例中我们把控件中的值存在Session变量中,然后在另一个页面中使用它,以不同页面间实现值传递的目的。但是,需要注意的是在Session变量存储过多的数据会消耗比较多的服务器资源,在使用session时应该慎重,当然了,我们也应该使用一些清理动作来去除一些不需要的session来降低资源的无谓消耗。使用Session变量传递值的一般步骤如下:
    a,在页面里添加必要的控件
    b,创建可以返回表单的按钮和链接按钮
    c,在按钮或链接按钮的单击事件里,把控件的值添加到session变量里
    d,使用Response.Redirect方法重定向到另一个页面
    e,在另一个页面提取session的值,在确定不需要使用该session时,要显式清除它

    移除个别:Session.Remove("aa");

    全部清除:Session.Clear(); (一般应用于注销)

    在开始使用前,首先看一下如何的使用SESSION,和ASP中相差不多
    写入SESSION变量:

    C#:
    Session["username"])="aa";

    VB:

    Session("username")="aa"
    读取SESSINN变量:

    C#
    string username= Session["username"];
    VB:

    dim username=Session("username")

    下面的是一段使用session的程序代码 :
       源页面代码:
    private void Button1_Click
    (object sender, System.EventArgs e)
    {
    Session["var1"]=TextBox1.Text;
    Session["var2"]=TextBox2.Text;
    Server.Transfer("webform1.aspx");
    }
    目标页面代码:
    private void Page_Load
    (object sender, System.EventArgs e)
    {
    Label1.Text=Session["var1"].ToString();
    Label2.Text=Session["var2"].ToString();
    Session.Remove("var1");
    Session.Remove("var2");
    }

    使用Server.Transfer
    这个方法相比上面介绍的方法稍微复杂一点,但在页面间变量传递中却是特别有用的,使用该方法你可以在另一个页面以对象属性的方式来存取显露的值,当然了,使用这种方法,你需要额外写一些代码以创建一些属性以便可以在另一个页面访问它,但是,这个方式带来的好处也是显而易见的。总体来说,使用这种方法是简洁的同时又是面向对象的。使用这种方法的整个过程如下:
    a,在页面里添加必要的控件
    b,创建返回值的Get属性过程
    c,创建可以返回表单的按钮和链接按钮
    d,在按钮单击事件处理程序中调用Server.Transfer方法转移到指定的页面
    e,在第二个页面中,我们就可以使用Context.Handler属性来获得前一个页面实例对象的引用,通过它,就可以使用存取前一个页面的控件的值了
    以下代码综合实现上述步骤过程的代码:
    源页面代码:
        把以下的代码添加到页面中
       public string Var1
    {
    get
    {
    return TextBox1.Text;
    }
    }

    public string Var2
    {
    get
    {
    return TextBox2.Text;
    }
    }
    然后调用Server.Transfer方法
    private void Button1_Click
    (object sender, System.EventArgs e)
    {
    Server.Transfer("webform1.aspx");
    }
       目标页面代码:
    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.Var1;
    Label2.Text=wf1.Var2;
    }

    后记:

    笔者在上面使用不同的方法实现了ASP.NET页面间变量传递,这三种方法是:QueryString,Session和Server.Transfer,或许你还可以找到其他的办法来实现ASP.NET页面间变量传递,实际上你稍想点办法也可以将变量传递给页面自己(页面刷新特别是换页显示时传递新的页号等时比较常用)。

    这里特别提下ruquest. QueryString 中的request对象实际上操作system.web 命名空间中的类httprequest。当客户发出请求执行asp.net时,CLR会将客户端请求信息包装在Request对象中。这些请求信息包括请求报头、客户端基本信息(浏览器信息、浏览器版本号、用户所用的语言、编码方式等)、请求方法(post、get)、参数名、参数值等。Request对象的调用方法为:

    Request.collection[“variable”]

    其中collection包括QueryStrin、Form、Cookies、ServerVariables四种集合,我们上面曾提到可以将Request.QueryString["var1"]写为Request["var1"]看起来比较简洁,但这样作其实不是一种好的方法,因为省掉collection选项后,Request会按照QueryString、Form、Cookies、ServerVariables的顺序进行搜索直到发现“variable”所指的关键字并返回其值,没有找到则返回(null)。因此为了提供程序的执行效率,最好还是指定collection,过多地搜索会影响程序执行的效率。置于Cookies、ServerVariables等我将在以后的文章详细说明。

    二. 页面间参数传递问题集合 QueryString Session Cookies Application


    ASP.NET提供了事件驱动编程模型,使开发者简化了应用程序的总体设计,但是这个也造成了它固有的一些问题,例如,在传统的ASP里,我们可以通过使用POST方法很容易地实现页面间传递变量,同样的事情,在使用事件驱动编程模型的ASP.NET就要麻烦一些,但是我们仍然有一些方法可以实现同样的功能。笔者在这里将包含使用querystring,session变量以及server.Transfer方法来实现页面间的变量传递。

    使用QueryString
    使用QuerySting在页面间传递值已经是一种很老的机制了,这种方法的主要优点是实现起来非常简单,然而它的缺点是传递的值是会显示在浏览器的地址栏上的(不安全),同时又不能传递对象,但是在很多传递的值少而安全性要求不高的情况下,这个方法还是较多地被首选使用。

    使用这种方法包括如下的步骤:
    a,使用控件创建web表单(form)
    b,创建可以返回表单的按钮和链接按钮
    c,在按钮或链接按钮的单击事件里创建一个保存URL的字符变量
    d,在保存的URL里添加QueryString参数
    e,使用Response.Redirect重定向到上面保存的URL
    下面的代码片断演示了如何实现这个方法:
    源页面代码:
    private void Button1_Click
    (object sender, System.EventArgs e)
    {
    string url;
    url="webform1.aspx?var1=" + TextBox1.Text + "&var2=" + TextBox2.Text;
    Response.Redirect(url);
    }
    目标页面代码:
    private void Page_Load
    (object sender, System.EventArgs e)
    {
    Label1.Text=Request.QueryString["var1"];

    // Label1.Text=Request.QueryString["var1"] 也可以直写为 Label1.Text=Request["var1"]下面的语句也是一样可以简写
    Label2.Text=Request.QueryString["var2"];
    }
    使用Session变量
    使用Session变量是可以在页面间传递值的的另一种方式,在本例中我们把控件中的值存在Session变量中,然后在另一个页面中使用它,以不同页面间实现值传递的目的。但是,需要注意的是在Session变量存储过多的数据会消耗比较多的服务器资源,在使用session时应该慎重,当然了,我们也应该使用一些清理动作来去除一些不需要的session来降低资源的无谓消耗。使用Session变量传递值的一般步骤如下:
    a,在页面里添加必要的控件
    b,创建可以返回表单的按钮和链接按钮
    c,在按钮或链接按钮的单击事件里,把控件的值添加到session变量里
    d,使用Response.Redirect方法重定向到另一个页面
    e,在另一个页面提取session的值,在确定不需要使用该session时,要显式清除它

    在开始使用前,首先看一下如何的使用SESSION,和ASP中相差不多
    写入SESSION变量:

    C#:
    Session["username"])="aa";

    VB:

    Session("username")="aa"
    读取SESSINN变量:

    C#
    string username= Session["username"];
    VB:

    dim username=Session("username")

    下面的是一段使用session的程序代码 :
       源页面代码:
    private void Button1_Click
    (object sender, System.EventArgs e)
    {
    Session["var1"]=TextBox1.Text;
    Session["var2"]=TextBox2.Text;
    Server.Transfer("webform1.aspx");
    }
    目标页面代码:
    private void Page_Load
    (object sender, System.EventArgs e)
    {
    Label1.Text=Session["var1"].ToString();
    Label2.Text=Session["var2"].ToString();
    Session.Remove("var1");
    Session.Remove("var2");
    }

    使用Server.Transfer
    这个方法相比上面介绍的方法稍微复杂一点,但在页面间变量传递中却是特别有用的,使用该方法你可以在另一个页面以对象属性的方式来存取显露的值,当然了,使用这种方法,你需要额外写一些代码以创建一些属性以便可以在另一个页面访问它,但是,这个方式带来的好处也是显而易见的。总体来说,使用这种方法是简洁的同时又是面向对象的。使用这种方法的整个过程如下:
    a,在页面里添加必要的控件
    b,创建返回值的Get属性过程
    c,创建可以返回表单的按钮和链接按钮
    d,在按钮单击事件处理程序中调用Server.Transfer方法转移到指定的页面
    e,在第二个页面中,我们就可以使用Context.Handler属性来获得前一个页面实例对象的引用,通过它,就可以使用存取前一个页面的控件的值了
    以下代码综合实现上述步骤过程的代码:
    源页面代码:
        把以下的代码添加到页面中
       public string Var1
    {
    get
    {
    return TextBox1.Text;
    }
    }

    public string Var2
    {
    get
    {
    return TextBox2.Text;
    }
    }
    然后调用Server.Transfer方法
    private void Button1_Click
    (object sender, System.EventArgs e)
    {
    Server.Transfer("webform1.aspx");
    }
       目标页面代码:
    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.Var1;
    Label2.Text=wf1.Var2;
    }

    后记:

    笔者在上面使用不同的方法实现了ASP.NET页面间变量传递,这三种方法是:QueryString,Session和Server.Transfer,或许你还可以找到其他的办法来实现ASP.NET页面间变量传递,实际上你稍想点办法也可以将变量传递给页面自己(页面刷新特别是换页显示时传递新的页号等时比较常用)。

    这里特别提下ruquest. QueryString 中的request对象实际上操作system.web 命名空间中的类httprequest。当客户发出请求执行asp.net时,CLR会将客户端请求信息包装在Request对象中。这些请求信息包括请求报头、客户端基本信息(浏览器信息、浏览器版本号、用户所用的语言、编码方式等)、请求方法(post、get)、参数名、参数值等。Request对象的调用方法为:

    Request.collection[“variable”]

    其中collection包括QueryStrin、Form、Cookies、ServerVariables四种集合,我们上面曾提到可以将Request.QueryString["var1"]写为Request["var1"]看起来比较简洁,但这样作其实不是一种好的方法,因为省掉collection选项后,Request会按照QueryString、Form、Cookies、ServerVariables的顺序进行搜索直到发现“variable”所指的关键字并返回其值,没有找到则返回(null)。因此为了提供程序的执行效率,最好还是指定collection,过多地搜索会影响程序执行的效率。置于Cookies、ServerVariables等我将在以后的文章详细说明。

    ·客户机
    1.查询字苻串RequryString---利用URL在客户机和服务器间进行数据交换
    2.隐藏的窗体字段---在窗体字段中设置和读取数据
    3.COOKIE---保存在客户浏览器上的数据
    4.视图状态ViewState---保存页面相关数据

    ·服务器
    5.应用程序Application---这种数据在应用程序整个生命周期内可以被所有用户利用
    6.会话Session---这种数据和每个用户联系
    7.暂存状态Context---这种数据在单个请求过程中存在
    8.缓存Cache---这种数据与应用程序相类似
    9.其他物理数据存放媒体---例如数据库,TXT文本,XML文件等等
    10. 使用Server.Transfer方法


    1. 使用QueryString变量

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

    a.aspx的C#代码

    private void Button1_Click(object sender, System.EventArgs e)
    {
        string s_url;
        s_url = "b.aspxname=" + Label1.Text;
        Response.Redirect(s_url);
    }

    b.aspx中C#代码
    private void Page_Load(object sender, EventArgs e)
    {
        Label2.Text = Request.QueryString["name"];
    }
    注意:
    如果参数为汉字,则会出现乱码或者最后一个汉字会不知所以的丢失。
    解决方法如下:
    方法1.在asp.net中可以用Server.UrlEncode(参数)将参数加密,然后在QueryString传递,在接受端跟平常一样将参数接受下来,然后用Server.UrlDecode(参数)将参数解密,就OK了。在javascript中可以用encodeurl和decodeurl来加解密。
    方法2.在中文参数后面加上一个字符串,在接受端接受后将字符去掉,就OK了,虽然有点雕虫小技的感觉,却屡试不爽!

    2.隐藏的窗体字段
    利用隐藏的窗体字段在客户机和服务器间传递数据也是可行的

    例如:
    <input type="hidden" name="aa" value="abc">

    string str=Request.Form["aa"];
    str就等于“abc“

    总结,最好不要放安全性高的数据,例如不要传递密码,银行卡号码等数据

    3. 使用Cookie对象变量

    这个也是大家常使用的方法,与Session一样,其是什对每一个用户而言的,但是有个本质的区别,即Cookie是存放在客户端的,而session是存放在服务器端的。而且Cookie的使用要配合ASP.NET内置对象Request来使用。

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

    4.视图状态ViewState---保存页面相关数据

    在控件中启用ViewState属性即可.

    5. 使用Application 对象变量

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

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

    6. 使用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();
    }

    7.暂存状态Context---这种数据在单个请求过程中存在

    ASP.NET提供一个类System.Web.HttpContext ,用来表示上下文,此对象有一个属性Items
    暂存状态就是利用HttpContext.Items属性来存放数据
    MSDN中HttpContext.Items属性的解释是这样的:获取可用于在 HTTP 请求过程中在 IHttpModule 和 IHttpHandler 之间组织和共享数据的键值
    HttpContext.Items属性中可以存放任何类型数据,无论这个属性中存放什么数据,都会在请求处理结束后自动清除,这就是暂存状态,数据的存放时间非常短.

    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)
    {
        a newWeb;   //实例a窗体
        newWeb = (source)Context.Handler;
        string name;
        name = newWeb.Name;
    }

    10. 使用Server.Transfer方法

    这个才可以说是面象对象开发所使用的方法,其使用Server.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)
    {
        a newWeb;   //实例a窗体
        newWeb = (source)Context.Handler;
        string name;
        name = newWeb.Name;
    }

  • 相关阅读:
    图解SQL inner join、left join、right join、full outer join、union、union all的区别
    Memcache应用场景介绍,说明[zz]
    PHP REST架构简单设计
    PHP的session存储对PHP运行环境的影响
    使用PHP创建一个REST API(Create a REST API with PHP)
    面试、笔试中常用的SQL语句(数据库知识必杀)一共50个!!!
    一.软件介绍(apache lighttpd nginx)
    spark总结3
    Spark 总结2
    Spark总结1
  • 原文地址:https://www.cnblogs.com/lushuicongsheng/p/1875509.html
Copyright © 2020-2023  润新知