zoukankan      html  css  js  c++  java
  • C#页面间的参数传递.doc

    ASP.NET中实现页面间的参数传递 QueryString\Application\Session\Cookie
    一.使用QueryString
        使用QueryString在页面间传递值是一种非常常见的方法,我们在ASP中就常常用到。

        (1)优点和缺点
        优点:
        1.使用简单,对于安全性要求不高时传递数字或是文本值非常有效。
        缺点:
        1.缺乏安全性,由于它的值暴露在浏览器的URL地址中的。
        2.不能传递对象。

        (2)使用方法
        1.在源页面的代码中用需要传递的名称和值构造URL地址。
        2.在源页面的代码用Response.Redirect(URL);重定向到上面的URL地址中。
        3.在目的页面的代码使用Request.QueryString["name"];取出URL地址中传递的值。

        (3)应用举例

        1.源页面*.aspx的代码:

       private void Button1_Click(object sender, System.EventArgs e)
       {
        string urlAddress;
        string Name1;
        string Name2;
        string Name3;
        string Name1Value = "HelloName1";  
        int Name2Value = 1234567;
        string Name3Value = "你好名称3";

        urlAddress = "destinationWebForm.aspx?Name1=" + Name1Value + "&" + "Name2=" + Name2Value.ToString() + "&" + "Name3=" +

    Name3Value;
        Response.Redirect(urlAddress);  
       }

        2.目的页面destinationWebForm.aspx的代码:
       private void Page_Load(object sender, System.EventArgs e)
       {
        string myName1Value;
        int    myName2Value;
        string myName3Value;

        myName1Value = Request.QueryString["Name1"];
        myName2Value = Convert.ToInt32(Request.QueryString["Name2"]);
        myName3Value = Request.QueryString["Name3"];
       }

    (4)可能出现的问题
    1在处理Resonse.QueryString函数汉字参数传递时,发生不能完整传递参数的具体值的错误,解决有两个方法。

    方法一:需要重新设置Web.config中的encoding和全球化设置。

    1、首行:<?xml version="1.0" encoding="utf-8" ?>
    更改为:
    <?xml version="1.0" encoding="GB2312" ?>
    2、<!-- 全球化
              此节设置应用程序的全球化设置。
        -->
        <globalization
                requestEncoding="utf-8"
                responseEncoding="utf-8"
       />
    更改为:
    <!-- 全球化
              此节设置应用程序的全球化设置。
        -->
        <globalization
                requestEncoding="GB2312"
                responseEncoding="GB2312"
       />
        [1]

        方法二:使用Server.UrlEncode和Server.UrlDecode对汉字或者特殊字符进行编码和解码。

        二、使用Application变量

        使用Application变量是在页面间传递值的第二种方式。
        Application变量在整个应用程序生命周期中都是有效的,类似于使用全局变量一样,所以可以在不同页面中对它进行存取。它和Session

    变量的区别在于,前者是所有的用户共用的全局变量,后者是各个用户独有的全局变量。
        举个例子来解释:
        网站访问的计数器变量一般采用Application变量,多个请求访问时共享这一个变量,均可对它进行操作,该变量可以被整个应用程序的各

    个页面直接使用。
       用户登陆的帐号名一般采用Session变量,多个请求访问时有各自的Session变量,只能对自己的该Session变量进行操作,整个应用程序的

    各个页面直接使用这个变量来获得用户的基本信息。

        (1)优点和缺点

        优点:
        1.使用简单,消耗较少的服务器资源。
        2.不仅能传递简单数据,还能传递对象。
        3.数据量大小是不限制的。

        缺点:
        1.作为全局变量容易被误操作。

        (2)使用方法

        1.在源页面的代码中创建你需要传递的名称和值构造Application变量:Application["Nmae"]="Value(Or Object)";
        2.在目的页面的代码使用Application变量取出传递的值。Result = Application["Nmae"]

        (3)应用举例

        1.源页面 *.aspx的代码:

    private void Button1_Click(object sender, System.EventArgs e)
       {
        string Name1Value = "HelloName1";  
        int Name2Value = 1234567;

        Application["Name1"] = Name1Value;
        Application["Name2"] = Name2Value;    
       }

        2.目的页面 *.aspx的代码:

    private void Page_Load(object sender, System.EventArgs e)
       {
        string myName1Value;
        int    myName2Value;

        myName1Value = Application["Name1"].ToString();
        myName2Value = (int)Application["Name2"];
       }


       三、使用Session变量

        使用Application变量是在页面间传递值的第三种方式。Session变量和Application变量非常类似,它们的区别也已经在上面关于

    Application变量时提到了。

        (1)优点和缺点
        优点:
        1.使用简单,不仅能传递简单数据类型,还能传递对象。
        2.数据量大小是不限制的。

        缺点:
        1.在Session变量存储大量的数据会消耗较多的服务器资源。


        (2)使用方法

        1.在源页面的代码中创建你需要传递的名称和值构造Session变量:Session["Nmae"]="Value(Or Object)";
        2.在目的页面的代码使用Session变量取出传递的值。Result = Session["Nmae"]

        (3)应用举例

          与Application变量类似,只是将Application替换为Session即可。

        四、使用Cookie对象


       使用Cookie对象是在页面间传递值的第四种方式。Cookie用于在用户浏览器上存储小块的信息,保存用户的相关信息,比如用户访问某网站

    时用户的ID,用户的偏好等,用户下次访问就可以通过检索获得以前的信息。所以Cookie也可以在页面间传递值。Cookie通过HTTP头在浏览器

    和服务器之间来回传递的。Cookie只能包含字符串的值,如果想在Cookie存储整数值,那么需要先转换为字符串的形式。
    可以通过遍历Request对象的Cookie集合可以获得所有的浏览器所有的Cookie。方法如下:
    foreach (string strKey in Request.Cookies)
    {
         lblCookies.Text += strKey + "=" + Request.Cookies[ strKey ].Value;
    }


        (1)优点和缺点

        优点:
        1.使用简单,是保持用户状态的一种非常常用的方法。比如在购物网站中用户跨多个页面表单时可以用它来保持用户状态。

        缺点:
        1.常常被人认为用来收集用户隐私而遭到批评。


        (2)使用方法

        1.在源页面的代码中创建你需要传递的名称和值构造Cookie对象:
        HttpCookie objCookie = new HttpCookie("myCookie","Hello,Cookie!");
        Response.Cookies.Add(cookie);
        2.在目的页面的代码使用Cookie对象取出传递的值:Result = Request.Cookies[ "myCookie" ].Value;

        (3)应用举例

        1.源页面 *.aspx的代码:

    private void Button1_Click(object sender, System.EventArgs e)
       {
        HttpCookie objCookie = new HttpCookie("myCookie","Hello,Cookie!");
        Response.Cookies.Add(objCookie);     
       }

        2.目的页面 *.aspx的代码:

    private void Page_Load(object sender, System.EventArgs e)
       {
        string myName1Value;
        myName1Value = Request.Cookies[ "myCookie" ].Value;
       }

        五、使用Server.Transfer


        使用Server.Transfer变量是在页面间传递值的第五种方式。上面的四个方法我们在ASP中常常使用,但是这个方法是在ASP.NET中新出现的

    。Server.Transfer是从当前的ASPX页面转到新的ASPX页面,服务器端执行新页并输出,在新页面中通过Context.Handler来获得前一个页面传递

    的各种数据类型的值、表单数据、QueryString.由于重定向完全在服务器端完成,所以客户端浏览器中的URL地址是不会改变的。
        调用Server.Transfer时,当前的ASPX页面终止执行,执行流程转入另一个ASPX页面,但新的ASPX页面仍使用前一ASPX页面创建的应答流。

    [2]

        在这里比较一下Server.Transfer和在“一”中使用的Response.Redirect的区别。
        (1)Server.Transfer在服务器端完成,所以客户端浏览器中的URL地址是不会改变的;Response.Redirect是客户端完成,向服务器端提出

    新的页面处理请求,所以客户端浏览器中的URL地址是会改变的。
         (2)Server.Transfer在服务器端完成,不需要客户端提出请求,减少了客户端对服务器端提出请求。[2]
        (3)Server.Transfer只能够转跳到本地虚拟目录指定的页面,也就是工程项目中的页面,而Response.Redirect则十分灵活,可以跳转到任何

    URL地址。
        (4)Server.Transfer可以将前一个页面的各种类型的值传到新的页面;Response.Redirect则只能借助URL中带参数或是结合上面四种办法

    把各种类型的值传到新的页面。
      
        继续我们的Server.Transfer用法。

        (1)优点和缺点

        优点:
        1.直接在服务器端重定向,使用简单方便,减少了客户端对服务器端提出请求。
        2.可以传递各种数据类型的值和控件的值。

        缺点:
        1.客户端浏览器中的URL地址是不改变,会导致在新的页面可能出现一些意想不到的问题。比如如果源页面和目的页面不在同一个虚拟目录

    或其子目录下,那么使用相对路径的图片、超链接都会导致错误的指向。[3]


        (2)使用方法

        1.在源页面的代码中,使用Page类的Server.Transfer跳到另一个页面传递页面数据:
        Server.Transfer("destinationWebForm.aspx","false")。

        2.在目的页面中,使用Context.Handler来接收数据:
        FormerPage formerPage = (FormerPage)Context.Handler;
        然后用formerPage的属性和方法来获取前一个页面的值,或者直接用
        Context.Items["myParameter "]
        来获取前一个页面的值。

        需要注意的是获取这些值必须在新的页面首次加载时,才能正确获取上一页面的各种数据类型或是控件的值。在以后的postback时,就无法

    获取上一页面的各种数据类型或是控件的值了,因为此时得到的当前页面的实例. 所以需要在新页面(destinationWebForm.aspx)的Page_Load

    ()事件中使用if(!IsPostBack)把获取前一个页面的值的代码包含起来,才能获得前一个页面传递的各种数据类型的值、表单数据、

    QueryString。

        (3)应用举例

        1.源页面 FormerPage.aspx的代码:

    public string HelloContextAttribute
       {
        get
        {
         return "Use Attribute: Hello,Context";
        }
       }
       public string HelloContextMethod()
       {
        return "Call Method: Hello,Context!";
       }

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


       private void Button1_Click(object sender, System.EventArgs e)
       {
        string Name1Value = "Hello, Name1!";
        TextBox1.Text ="Hello,TextBox1!";

        ArrayList myList = new ArrayList(3);//创建动态数组
        myList.Add("Hello,Array1! ");//向动态数组中添加新的值
        myList.Add("Hello,Array2!");
        myList.Add("Hello,Array3!");
        //Context可保存任意数据类型,Context字典特定于某个Http请求。
        //对于不同客户端,值是不一样的。
        Context.Items["destinationList"] = myList;//在Context.Items中保存动态数组

        Context.Items.Add("newContext","Hello,NewContext");//在Context.Items中保存一组名称-值的数据

        //Server.Transfer第二参数如果为true,表示本页面的Form和QuerryString的值在新页面继续有效。
        //否则在新页面无法获得TextBox1的值。
        Server.Transfer("destinationWebForm.aspx?Name1="+ Name1Value,true);
       }


        2.目的页面 destinationWebForm.aspx的代码:
      
       private void Page_Load(object sender, System.EventArgs e)
       {
        if(!IsPostBack)
        {
         try
         {
          string helloContextAttribute;
          string helloContextMethod;
          string textBoxValue;
          string contextItemsValue;
          string queryString;

          ArrayList listResult;

          FormerPage formerPage = (FormerPage)Context.Handler;
          helloContextAttribute = formerPage.HelloContextAttribute;//通过FormerPage中定义的属性来获取值
          helloContextMethod = formerPage.HelloContextMethod();//通过FormerPage中定义的方法来获取值
          textBoxValue = formerPage.TextBoxValue;//通过FormerPage中返回文本控件的值
          //下面的方法多用于用户在控件中输入值后才能获取,但是在程序中给直接TextBox1.Text赋值,那么下面的方法获得
          //的空值,在这种情况下需要使用上面的获取方法
          //textBoxValue = Request.Form["TextBox1"];
             
          contextItemsValue = Context.Items["newContext"].ToString();//通过FormerPage中Context的Items获取值
          listResult = (ArrayList)Context.Items["destinationList"];//通过FormerPage中Context的Items获取对象,强制转换类型:
          queryString = Request.QueryString["Name1"];//通过FormerPage的URL中的QueryString获取值
         }
         catch
         {
          Response.Write("Error!");
         }           
        }
       }

  • 相关阅读:
    Linux命令应用大词典-第11章 Shell编程
    Kubernetes 学习12 kubernetes 存储卷
    linux dd命令
    Kubernetes 学习11 kubernetes ingress及ingress controller
    Kubernetes 学习10 Service资源
    Kubernetes 学习9 Pod控制器
    Kubernetes 学习8 Pod控制器
    Kubernetes 学习7 Pod控制器应用进阶2
    Kubernetes 学习6 Pod控制器应用进阶
    Kubernetes 学习5 kubernetes资源清单定义入门
  • 原文地址:https://www.cnblogs.com/lyanm/p/2361601.html
Copyright © 2011-2022 走看看