zoukankan      html  css  js  c++  java
  • C/S ASP.NET页面传值汇总

    一、

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

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

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

      例子:(1)a.aspx

    private void Button1_Click(object sender, System.EventArgs e) 

      string s_url; 
      s_url = "b.aspx?name=" + Label1.Text; 
      Response.Redirect(s_url); 
    }
      (2)b.aspx

    private void Page_Load(object sender, EventArgs e) 

      Label2.Text = Request.QueryString["name"]; 
    }

    ------------------------------------------------

    1、GET传值方式

    发送页面:

    <a href="WebReceivePage.aspx?Id=1">进入接受页面</a>

    接受页面 WebReceivePage.cs

    if(!string.IsNullorEmpty(Request.QueryString["Id"]))

    {

    //处理代码

    }

    2、Post方式

    POST方式和GET方法的最大区别就是把发送的数据和URI地址分离。请求参数是在http标题的一个不同部分(名为entity body)传输的,同时POST传值方式理论上没有大小限制。

    <form>
    <input name="str" type="text" value="kewin string" />
    <input type="submit" value="POST 传值" />
    </form> 
    接受页面 cs代码
    if(!string.IsNullorEmpty())
    {
    txtReceive.Text=Request.Form["str"];

    //form中不能够有 runat="server" 否则Post不起作用,如果使用runat="server"则可以 另外附加一个form 通过button调用
    //JavaScript的方式 form.action="Receiver.aspx"; form.submit();

    3、使用Session 、Application、Cookie

      想必这个肯定是大家使用中最常见的用法了,其操作与Application类似,作用于用户个人,所以,过量的存储会导致服务器内存资源的耗尽。

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

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

         2.容易丢失。

      使用方法:1.在源页面的代码中创建你需要传递的名称和值构造Session变量:Session["Name"]="Value(Or Object)";

           2.在目的页面的代码使用Session变量取出传递的值。Result = Session["Nmae"]

      注意:session不用时可以销毁它,销毁的方法是:清除一个:Session.Remove("session名");

                             清除所有:Session.Clear();

      例子:(1)a.aspx

    private void Button1_Click(object sender, System.EventArgs e) 

      Session["name"] = Label.Text; 
    }
      (2)b.aspx

    private void Page_Load(object sender, EventArgs e) 

      string name; 
      name = Session["name"].ToString(); 
    }

    -------------------------------------

      这个也是大家常使用的方法,Cookie用于在用户浏览器上存储小块的信息,保存用户的相关信息,比如用户 访问某网站时用户的ID,用户的偏好等,用户下次访问就可以通过检索获得以前的信息。所以Cookie也可以在页面间传递值。Cookie通过HTTP头 在浏览器和服务器之间来回传递的。Cookie只能包含字符串的值,如果想在Cookie存储整数值,那么需要先转换为字符串的形式。

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

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

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

         2.安全性不高,容易伪造。

      

      使用方法:1.在源页面的代码中创建你需要传递的名称和值构造Cookie对象:

    HttpCookie objCookie = new HttpCookie("myCookie","Hello,Cookie!");
    Response.Cookies.Add(cookie); 
          2.在目的页面的代码使用Cookie对象取出传递的值:Result = Request.Cookies[ "myCookie" ].Value;

      例子:(1)a.aspx

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

    string myName1Value;
    myName1Value = Request.Cookies[ "myCookie" ].Value;

    --------------------------------------------------------------

      Application对象的作用范围是整个全局,也就是说对所有用户都有效。它在整个应用程序生命周期中都是有效的,类似于使用全局变量一 样,所以可以在不同页面中对它进行存取。它和Session变量的区别在于,前者是所有的用户共用的全局变量,后者是各个用户独有的全局变量。

      可能有人会问,既然所有用户都可以使用application变量,那他可以用在什么场合呢?这里举个例子:网站访问数。多个请求访问时都可以对它进行操作。

      优点:1.使用简单,消耗较少的服务器资源。

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

         3.数据量大小是不限制的。

      缺点:1.作为全局变量容易被误操作。所以单个用户使用的变量一般不能用application。

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

           2.在目的页面的代码使用Application变量取出传递的值。Result = Application["Nmae"]

      注意:常用lock和unlock方法用来锁定和解锁,为了防止并发修改。

      例子:(1)a.aspx

    private void Button1_Click(object sender, System.EventArgs e) 

      Application["name"] = Label1.Text; 
    }
      (2)b.aspx


    private void Page_Load(object sender, EventArgs e) 

      string name; 
      Application.Lock(); 
      name = Application["name"].ToString(); 
      Application.UnLock(); 
    }
    -------------------------------------------------------------

    发送页 SendPage.cs

    Session["Str"]="String Test";

    //Application["Str"]="String Test";

    Server.Transfer("ReceivePage.aspx");//Server.Transfer() 方法直接在服务器上面执行页面控制权转移,此期间Request、 Session等保持不变

    接受页面 ReceivePage.cs

    string Str=Session["Str"];

    //string Str=Application["Str"];

    4、定义一个公共的静态变量,通过 Server.Transfer()方法转移控制权,在接受页面取得该值;

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

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

      ps:比较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中带参数或是结合上面四种办法把各种类型的值传到新的页面。

      优点:1.直接在服务器端重定向,使用简单方便,减少了客户端对服务器端提出请求。

         2.可以传递各种数据类型的值和控件的值。

      缺点:1.客户端浏览器中的URL地址是不改变,会导致在新的页面可能出现一些意想不到的问题。比如如果源页面和目的页面不在同一个虚拟目录或其子目录下,那么使用相对路径的图片、超链接都会导致错误的指向。

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

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

      例子:(1)a.aspx

     
    public string Name 

      get{ return Label1.Text;} 

    private void Button1_Click(object sender, System.EventArgs e) 

      Server.Transfer("b.aspx"); 
    }
     
        (2)b.aspx

     
    private void Page_Load(object sender, EventArgs e) 

      a newWeb; //实例a窗体 
      newWeb = (source)Context.Handler; 
      string name; 
      name = newWeb.Name; 
    }
     


    5、使用Context.Handler
    MSDN:The reference to the Handler property will remain the same even after the current page has been changed by a server-side method, such as the Execute method or the Transfer method.
    实际上当您调用 Server.Transfer 时,ASP.NET 将内部调用 Server.Execute 方法来传输该的控件,并调用 Response.End 方法以结束当 前页的处理。 Response.End 结束执行页,并调用 Thread.Abort 方法。 Thread.Abort 方法导致 ThreadAbortException 错误信息显示。


    发送页面 包含控件 textbox
    Server.Transfer("ReceivePage.aspx");
    接受页面 
    SendPage page=(SendPage)Context.Handler;
    string str=((TextBox)page.FindControl("textbox")).Text;

    或者
    发送页面定义 public string str="just string text";
    Server.Transfer("ReceivePage.aspx");
    接收页面
    SendPage page=(SendPage)Context.Handler;
    string str=page.str;

    //在此有一个疑惑就是Context.Handler可以转换为SendPage ,我想应该是在HttpHandler的ProcessRequest方法或者什么地方将SendPage赋予了HttpHandler,这样才可以进行基类到派生类的转换。

    6、使用 Context.Items

    public IDictionary Items
    {
    get
    {
    if (this._items == null)
    {
    this._items = new Hashtable();
    }
    return this._items;
    }
    }
    Items的具体项IDictionary而言,具有get、set属性,所以可以通过Items来传递数据
    同样需要注意的是在发送端使用Server.Transfer()方法跳转到接受页面,具体设置方法与Session使用方法相同;

    二、如果在两个页面间需要大量的参数要传传递,如数据查询等页面时,用1 - 6的方法传值及其不便,而第 7 种方法确有一独特的优势!但使用该方法时需要一定的设置,现简单介绍一下该方法的使用方式:
    以查询数据页面为例:
    在查询页面中设置如下公有属性(QueryPage.aspx):

    以下为引用的内容:
    public class QueryPage : System.Web.UI.Page
    {
    protected System.Web.UI.WebControls.TextBox txtStaDate;
    protected System.Web.UI.WebControls.TextBox txtEndDate;
    ...
    /// <summary>
    /// 开始时间
    /// </summary>
    public string StaDate
    {
    get{ return this.txtStaDate.Text;}
    set{this.txtStaDate.Text = value;}
    }
    /// <summary>
    /// 结束时间
    /// </summary>
    public string EndDate
    {
    get{ return this.txtEndDate.Text;}
    set{this.txtEndDate.Text = value;}
    }
    ....
    private void btnEnter_Click(object sender, System.EventArgs e)
    {
    Server.Transfer("ResultPage.aspx");
    }

    在显示查询结果页面(ResultPage.aspx):

    以下为引用的内容:
    public class ResultPage : System.Web.UI.Page
    {
    private void Page_Load(object sender, System.EventArgs e)
    {
    //转换一下即可获得前一页面中输入的数据
    QueryPage queryPage = ( QueryPage )Context.Handler;

    Response.Write( "StaDate:" );
    Response.Write( queryPage.StaDate );
    Response.Write( "<br/>EndDate:" );
    Response.Write( queryPage.EndDate );
    }
    }

    三、如果有许多查询页面共用一个结果页面的设置方法:
    在这种方式中关键在于“ QueryPage queryPage = ( QueryPage )Context.Handler; ”的转换,只有转换不依赖于特定的页面时即可实现。
    如果让所有的查询页面都继承一个接口,在该接口中定义一个方法,该方法的唯一作用就是让结果页面获得构建结果时所需的参数,就可实现多页面共享一个结果页面操作!

    1、先定义一个类,用该类放置所有查询参数:

    以下为引用的内容:
    /// <summary>
    /// 结果页面中要用到的值
    /// </summary>
    public class QueryParams
    {
    private string staDate;
    private string endDate;
    /// <summary>
    /// 开始时间
    /// </summary>
    public string StaDate
    {
    get{ return this.staDate;}
    set{this.staDate = value;}
    }
    /// <summary>
    /// 结束时间
    /// </summary>
    public string EndDate
    {
    get{ return this.endDate;}
    set{this.endDate = value;}
    }
    }

    2、接口定义:

    以下为引用的内容:
    /// <summary>
    /// 定义查询接口。
    /// </summary>
    public interface IQueryParams
    {
    /// <summary>
    /// 参数
    /// </summary>
    QueryParams Parameters{get;}
    }

    3、查询页面继承IQueryParams接口(QueryPage.aspx):

    以下为引用的内容:
    /// <summary>
    ///查询页面,继承接口
    /// </summary>
    public class QueryPage : System.Web.UI.Page, IQueryParams
    {
    protected System.Web.UI.WebControls.TextBox txtStaDate;
    protected System.Web.UI.WebControls.TextBox txtEndDate; 
    private QueryParams queryParams;
    ...
    /// <summary>
    /// 结果页面用到的参数
    /// </summary>
    public QueryParams Parameters
    {
    get
    {
    return queryParams;
    }
    }
    ....
    private void btnEnter_Click(object sender, System.EventArgs e)
    {
    //赋值
    queryParams = new QueryParams();
    queryParams.StaDate = this.txtStaDate.Text;
    queryParams.EndDate = this.txtEndDate.Text

    Server.Transfer("ResultPage.aspx");
    }
    }

    4、别外的页面也如此设置
    5、接收页面(ResultPage.aspx):

    以下为引用的内容:
    public class ResultPage : System.Web.UI.Page
    {
    private void Page_Load(object sender, System.EventArgs e)
    {
    QueryParams queryParams = new QueryParams();
    IQueryParams queryInterface;
    //实现该接口的页面
    if( Context.Handler is IQueryParams)
    {
    queryInterface = ( IQueryParams )Context.Handler;
    queryParams = queryInterface.Parameters;
    }

    Response.Write( "StaDate:" );
    Response.Write( queryParams.StaDate );
    Response.Write( "<br/>EndDate:" );
    Response.Write( queryParams.EndDate );
    }
    }

     
    因在工作中要作一个数据查询,参数烦多,原先是用Session传递,用完该Session传来的参数后,还需清理Session,在用Session之 前还得判断该Session是否存在,极其烦琐,我想应该还有更简便的方法来实现页面间的参数传递,故上网查找,终于找到这样一种方式来实现页面间的参数 传递。

  • 相关阅读:
    Ubuntu下ClickHouse安装
    redis.conf配置详解(转)
    php使用sftp上传文件
    ubuntu下安装nginx1.11.10
    cookie和session的区别
    linux下Redis主从复制
    linux-ubuntu 安装配置Redis
    php的常量
    Ubuntu防火墙配置
    技术资料
  • 原文地址:https://www.cnblogs.com/roboot/p/4820159.html
Copyright © 2011-2022 走看看