zoukankan      html  css  js  c++  java
  • ASP.NET 2.0 学习笔记 2: 页面间传值

    本文共讨论了六种方法:
    一.QuerySting
     1.缺点: 传递的值是会显示在浏览器的地址栏上的(不安全),同时又不能传递数组或对象。
     2.优点: 实现起来非常简单,多用于传递一个或多个安全性要求不高或是结构简单的数值。
     3.示例:
       源页面formA.aspx 代码:
       ======================

        protected void Button_QuerySting_Click(object sender, EventArgs e)
        {
            
    string url = "formB.aspx?ID=" + this.TextBox_ID.Text + "&Name=" + 
            
    this.TextBox_Name.Text;
            Response.Redirect(url);
        }


         目标页面formB.aspx 代码:
       ======================== 

       protected void Page_Load(object sender, EventArgs e)
        {
            
    string ID= Request.QueryString["ID"];
            
    string Name = Request.QueryString["Name"];
            PopMsg(ID, Name);
        }

        
    public void PopMsg(string ID,string Name)
        {
            
    string msg = "ID:" + ID + ",Name:" + Name+" ****** ";
            
    this.Label1.Text += msg;
            
    //System.Web.HttpContext.Current.Response.Write("<script 
           language=javascript>alert('" + msg + "');</script>");
        }

    二.Session
    使用Session状态变量来保存在当前会话(单个用户)中位于本地的项;
    1.缺点:
         session是存放在服务器端的,存储过多的数据会消耗比较多的服务器资源,需要经常清理一些不需要的session,

    以降低服务器内存资源的消耗;超过设定保存时间,切换用户,关闭了浏览器更换另一浏览器或更换了另一机器,其中保存

    的数据将丢失;
    2.优点:
        作用于用户个人,跟着用户走的。但过量的存储会导致服务器内存资源的耗尽。因此适合保存少量,临时的信息; 可保

    存自定义的类等;
    3.应用场合:
        保存登陆状态:超时很有用,当更换浏览器或机器时都自然地要求一个新的登陆。
        保存取自数据库中的用户数据:本地缓存可避免每次请求都连接数据库。
        保存临时的用户数据:临时数据包括查找结果,表单状态或无需长期保存的Guest购物车内容。
    4. 示例:

    public class UserInfo
    {
            
    //
            
    // TODO: 在此处添加构造函数逻辑
            
    //
            public  UserInfo()
            {        } 
            
    public string ID = "";
            
    public string Name = "";   
    }

    源页面代码:
        
    protected void Button_Session_Click(object sender, EventArgs e)
        {
            Session[
    "ID"= this.TextBox_ID.Text;
            Session[
    "Name"= this.TextBox_Name.Text;

            UserInfo myInfo 
    = new UserInfo();
            myInfo.ID 
    = this.TextBox_ID.Text;
            myInfo.Name 
    = this.TextBox_Name.Text;

            Session[
    "myInfo"= myInfo;

            Server.Transfer(
    "formB.aspx");
        }
    目标页面代码:
         
    protected void Button_session_Click(object sender, EventArgs e)
        {
            PopMsg(Session[
    "ID"].ToString(), Session["Name"].ToString());

            UserInfo myInfo 
    = (UserInfo)Session["myInfo"];
            PopMsg(myInfo.ID, myInfo.Name);

            Session.Remove(
    "ID");
            Session.Remove(
    "Name");
            Session.Remove(
    "myInfo");
            
    //Session.RemoveAll();       
        }

    5.配置Sessoin的使用策略:
        我们可以在配置文件中配置Sessoin的使用策略:
        <system.web>
          <sessionState timeout ="20" cookieless ="true " mode ="InProc "></sessionState>
          ....
        </system.web>
        以上配置SessionState,表示每个Session超时为20分钟(20分钟内客户端没有任何操作)。cookieless表示

    该会话是否使用Cookie作为标识ID。    mode=“Inproc”表示会话的存储位置为进程中,另外还有SQLServer,

    stateServer,Customer等。这些配置可在网站发布之后进行。
        它们的设置将会影响程序性能,所以最好深入理解这些取值的含义。请参考相关资料;

    三.Server.Transfer
    1.工作原理
        它传递一个页面对象。
        这种方法是简洁的同时又是面向对象的;可以在另一个页面以对象属性的方式来存取相应的值;
        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在服务器端完成,不需要客户端提出请求,减少了客户端对服务器端提出请求。
       (3)Server.Transfer只能够转跳到本地虚拟目录指定的页面,也就是工程项目中的页面,而Response.Redirect则十分

    灵活,可以跳转到任何URL地址。
       (4)Server.Transfer可以将前一个页面的各种类型的值传到新的页面;Response.Redirect则只能借助URL中带参数或

    是结合上面四种办法把各种类型的值传到新的页面。
    3.优点和缺点
      优点:
        1.直接在服务器端重定向,使用简单方便,减少了客户端对服务器端提出请求。
        2.可以传递各种数据类型的值和控件的值。
      缺点:
        1.客户端浏览器中的URL地址是不改变,会导致在新的页面可能出现一些意想不到的问题。比如如果源页面和目的页面不

    在同一个虚拟目录或其子目录下,那么使用相对路径的图片、超链接都会导致错误的指向。
    源页面代码:
    把以下的代码添加到页面中 

        UserInfo myInfo = new UserInfo();

        
    public string GsID
        {
            
    get { return this.TextBox_ID.Text; }
            
    set { this.TextBox_ID.Text = value; }
        }

        
    public string GsName
        {
            
    get { return this.TextBox_Name.Text; }
            
    set { this.TextBox_Name.Text = value; }
        }

        
    public UserInfo GsMyInfo
        {
            
    get { return myInfo; }
            
    set { myInfo = value; }
        }


    然后调用Server.Transfer方法
          
    protected void Button_ServerTransfer_Click(object sender, EventArgs e)
          {
            Context.Items.Add(
    "Context""Context from formA");

            myInfo.ID 
    = this.TextBox_ID.Text;
            myInfo.Name 
    = this.TextBox_Name.Text;

            Server.Transfer(
    "formB.aspx",true );
         }
    目标页面代码: 
    //注意必须在 Page_Load 事件里才能获取;
     
        
    protected void Page_Load(object sender, EventArgs e)
        {
            
            
    //create instance of source web form
            formA wf1;
            
    //get reference to current handler instance
            wf1 = (formA)Context.Handler;

            PopMsg(
    " 1:"+wf1.GsID, "1:"+ wf1.GsName);
            UserInfo myInfo 
    = new UserInfo();
            myInfo 
    = wf1.GsMyInfo;
            PopMsg(myInfo.ID, myInfo.Name);
        }


    四.Application
       使用Application状态变量来存储应用程序中所有用户都可用的项;
    1.优缺点:
        Application对象的作用范围是整个全局,也就是说对所有用户都有效。其常用的方法有Lock和UnLock。
        此种方法不常使用,因为Application在一个应用程序域范围共享,所有用户可以改变及设置其值,故只应用计数器

    等需要全局变量的地方。
    2.示例:

    源页面代码:
        
    protected void Button_Application_Click(object sender, EventArgs e)
        {
            Application[
    "ID"= this.TextBox_ID.Text;
            Application[
    "Name"= this.TextBox_Name.Text;
            Server.Transfer(
    "formB.aspx");
        }

    目的页面代码:
        
    protected void Button_application_Click(object sender, EventArgs e)
        {
            Application.Lock();
            PopMsg(Application[
    "ID"].ToString(), Application["Name"].ToString());
            Application.UnLock();
        }

    五.Cookie
       使用cookie 将少量的信息存储在客户端。客户端可能拒绝Cookie,所以代码中应考虑这种可能性;
       Cookies是由服务端(如ASP.NET)创建的一块发送给客户端(浏览器)的数据。在每次重新请求时又会回传给

    服务端。一旦浏览器关闭,这些Cookies或被删除掉或被保存起来(浏览器中可以设定这些),对于已存储的Cookies

    (一些位于浏览器端机器磁盘中的文件),下一次打开浏览器访问同一网站时这些Cokies会被重新传递的(如果被删除

    掉,下一次打开浏览器访问同一网站或页面时,Cookies由服务器端重新创建)。
       使用Cookies是为了标识客户端,相当于身份标识,只所以如此是因为HTTP协议是无状态的,但实际的应用又往往是

    有状态的(试想如何区分访问同一个页面的客户的身份),我们不得不考虑状态的存储问题,Cookies便是这样一种解决

    方案。
       Cookie中可存储的东西如用户信息,偏好,等,借助于Cookies我们可实现如:每次在同一台计算机上访问同一个网

    站时不需要重新输入密码这样的功能。对于用户登出,一般会删掉Cookie。   与Session一样,它是针对每一个用户而

    言的,但是有个本质的区别,即Cookie是存放在客户端的,而session是存放在服务器端的。而且Cookie的使用要配合

    ASP.NET内置对象Request来使用。
        Cookie用于在用户浏览器上存储小块的信息,保存用户的相关信息,比如用户访问某网站时用户的ID,用户的偏好等,

    用户下次访问就可以通过检索获得以前的信息。所以Cookie也可以在页面间传递值。Cookie通过HTTP头在浏览器和服务

    器之间来回传递的。
       Cookie只能包含字符串的值,如果想在Cookie存储整数值,那么需要先转换为字符串的形式。
       可以通过遍历Request对象的Cookie集合可以获得所有的浏览器所有的Cookie。
       如: Request.Cookies [2]
       Cookie默认会在浏览器关闭时清除,但我们也可以在代码中指定Cookie的生存期:
       如:myCookie.Expires = DateTime.Now.AddMinutes (3);

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

    持用户状态。
         缺点: 常常被人用来收集用户隐私。
    2.示例:

    源页面代码:
     
    protected void Button_cookie_Click(object sender, EventArgs e)
        {
           
            
    //如果浏览器支持cookie
            if (Request.Browser.Cookies)
            {
                HttpCookie myCookie 
    = new HttpCookie("ID");
                myCookie.Value 
    = this.TextBox_ID.Text;
                Response.Cookies.Add(myCookie);
                 myCookie 
    = new HttpCookie("Name");
                myCookie.Value 
    = this.TextBox_Name.Text;
                Response.Cookies.Add(myCookie);
            }
            Server.Transfer(
    "formB.aspx");

        }
      目的页面代码:

      
    protected void Button_cookie_Click(object sender, EventArgs e)
        {
            
    if (Request.Browser.Cookies)
            {
                
    if ((Request.Cookies["ID"!= null&& (Request.Cookies["Name"!= null))
                {
                    PopMsg(Request.Cookies[
    "ID"].Value.ToString(), Request.Cookies["Name"].Value.ToString());
                }
            }

            StringBuilder cookiesInfo 
    = new StringBuilder();
            
    //遍历Request中的cookies对象的所有键值
            foreach (string str in this.Request.Cookies.AllKeys)
            {
                cookiesInfo.Append(
    "key:" + str+",");
                cookiesInfo.Append(
    "keyValue:" + Request.Cookies[str].Value+",");
                cookiesInfo.Append(
    "<br/>");
                
            }
            PopMsg(cookiesInfo.ToString(),
    "");
        }


    六. PostBackUrl()方法

    Code

    页面传值源码下载

  • 相关阅读:
    C#关于MSMQ通过HTTP远程发送专有队列消息的问题
    ASP.NET中进行消息处理(MSMQ) 三
    ASP.NET中进行消息处理(MSMQ) 二
    ASP.NET中进行消息处理(MSMQ) 一
    日志插件 log4net 的使用
    在64位windows下使用instsrv.exe和srvany.exe创建windows服务
    Windows下MemCache多端口安装配置
    把页面上DIV元素生成图片
    memcached协议
    没钱买珍珠首饰,能够画一个
  • 原文地址:https://www.cnblogs.com/furenjun/p/aspnetTransferValue.html
Copyright © 2011-2022 走看看