`

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

分享到:
评论

相关推荐

    ASP.NET C#页面传值汇总

    ASP.NET C#页面传值( Querystring / Session /Server.Transfer /Application /Cookie)实例化的讲解 直观易懂 一看就会

    ASP.NET页面之间传值

    ASP.NET C#页面之间传值.QueryString,Application,Session,Cookie,Server.Transfer

    asp.net知识库

    在ASP.Net中两种利用CSS实现多界面的方法 如何在客户端调用服务端代码 页面一postback,它就显示页面的最顶端,怎样让它定位在某一位置? 如何保证页面刷新后的滚动条位置 清除网页历史记录,屏蔽后退按钮! 如何传值...

    ASP.NET跨页面传值技巧总结.mht

    使用QueryString变量 使用Application 对象变量 使用Session变量 使用Cookie对象变量 使用Server.Transfer方法

    ASP.NET的几种页面传值方法

    ASP.NET的几种页面传值方法(使用QueryString变量 2. 使用Application 对象变量 3. 使用Session变量 4. 使用Cookie对象变量 ....)

    ASP.NET中页面之间传递值的几种方式整理

    但是一般来说,常用的较简单有QueryString,Session,Cookies,Application,Server.Transfer。一、QueryString QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中。如果是传递一个或多...

    ASP.NET常用代码

    6.表格超连接列传递参数 &lt;asp:HyperLinkColumn Target="_blank" headertext="ID号" DataTextField="id" NavigateUrl="aaa.aspx?id='(Container.DataItem, "数据字段1")%&gt;' & name='(Container.DataItem, "数据字段2...

    ASP.NET面试题

    . 简述 private、 protected、 public、 internal 修饰符的访问权限...6.如果在一个B/S结构的系统中需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进行处理? 答 : this.Server.Transfer

    ASP.NET面试题大全

    6.如果在一个B/S结构的系统中需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进行处理? 答 : this.Server.Transfer 7.请编程遍历页面上所有TextBox控件并给它赋值为string.Empty? 答...

    net学习笔记及其他代码应用

    6.如果在一个B/S结构的系统中需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进行处理? 答 : this.Server.Transfer 7.请编程遍历页面上所有TextBox控件并给它赋值为string.Empty? ...

    跨页传值的常用方法 东东

    而且Cookie的使用要配合Asp.Net内置对象Request来使用。 a.aspx的C#代码 private void Button1_Click(object sender, System.EventArgs e) { HttpCookie cookie_name = new HttpCookie("name"); cookie_name....

    ASP3《高级编程》(第二部分)

    2.3.5 ASP中cookie的使用 52 2.4 使用ServerVariables集合 53 2.4.1 “自引用”页面 54 2.4.2 检测浏览器的版本 55 2.4.3 检测浏览器的语言 56 2.4.4 其他有用的ServerVariables集合的值 57 2.5 其他Request和...

    ASP3《高级编程》(第一部分)

    2.3.5 ASP中cookie的使用 52 2.4 使用ServerVariables集合 53 2.4.1 “自引用”页面 54 2.4.2 检测浏览器的版本 55 2.4.3 检测浏览器的语言 56 2.4.4 其他有用的ServerVariables集合的值 57 2.5 其他Request和...

    C#编程经验技巧宝典

    111 &lt;br&gt;0184 如何在ASP.NET中获取文件的扩展名 111 &lt;br&gt;0185 如何在ASP.NET中用URL在页面之间传值 112 &lt;br&gt;0186 如何使用IsPostBack实现ASP.NET页面加载 112 &lt;br&gt;0187 如何利用输出缓存技术缓存...

    Baby Web Server v2.7.2.zip

    Baby Web Server 是一个非常小巧玲珑的网络服务器,支持Html,还支持ASP部分功能(Request,Response,Server,QueryString and Form collections, Global.asa, Session and Application objects及其他)、更支持Cookie、...

    迷你ASP服务器(Baby Web Server) V2.6 绿色版

    baby ASP Web Server 是一个小巧玲珑的网络服务器,支持ASP部分功能(Request,Response,Server,QueryString and Form collections, Global.asa, Session and Application objects及其他)、更支持Cookie、SSI、IP限制等...

    ASP对象全接触资料集

    | | ├────────ASP 中如何调用ocx控件.txt | | ├────────ASP 内建对象.txt | | ├────────aspdoc.chm | | ├────────ASP内置对象.txt | | ├────────SDK文档.txt | |...

    asp连接数据库代码实例

    参数 \"&query_name&\" 的值中包含非法字符串!\\n\\n\');location=\'\"&request.ServerVariables(\"HTTP_REFERER\")&\"\'&lt;/Script&gt;\" response.end end if next next end if %&gt; --------------------------...

Global site tag (gtag.js) - Google Analytics