zoukankan      html  css  js  c++  java
  • asp.net 页面之间的传值方式

    ASP.NET提供了卓越的事件驱动编程模型,让开发者简化了应用程序的总体设计,但是这个也造成了它固有的一些问题,例如,使用传统的ASP里,我们可以通过使用POST方法很容易地实现页面间传递值,同样的事情,在使用事件驱动编程模型的ASP.NET就不是那么容易了,当然了,我们仍然有一些方法可以实现同样的功能。本文将试着使用不同的可能的方法来解决这个问题,但可以预见是,本文将包含使用querystring,session变量,Cookie对象以及server.Transfer方法来实现页面间的值传递。 

    使用QueryString


    使用QuerySting在页面间传递值已经是一种很老的机制了,这种方法的主要优点是实现起来非常简单,然而它的缺点是传递的值是会显示在浏览器的地址栏上的(不安全),同时又不能传递对象,但是在传递的值少而安全性要求不高的情况下,这个方法还是一个不错的方案。使用这种方法的步骤如下: 
    1,使用控件创建web表单(form) 
    2,创建可以返回表单的按钮和链接按钮 
    3,在按钮或链接按钮的单击事件里创建一个保存URL的字符变量 
    4,在保存的URL里添加QueryString参数 
    5,使用Response.Redirect重定向到上面保存的URL 

    下面的代码片断演示了如何实现这个方法: 
    源页面代码: 
    private void Button1_Click 
    (object sender, System.EventArgs e) 

    string url; 
    url="anotherwebform.aspx?name=" + TextBox1.Text + "&email=" + TextBox2.Text; 
    Response.Redirect(url); 

    目标页面代码: 
    private void Page_Load 
    (object sender, System.EventArgs e) 

    Label1.Text=Request.QueryString["name"]; 
    Label2.Text=Request.QueryString["email"]; 


    使用Session变量


    使用Session变量是可以在页面间传递值的的另一种方式,在本例中我们把控件中的值存在Session变量中,然后在另一个页面中使用它,以不同页面间实现值传递的目的。但是,需要注意的是在Session变量存储过多的数据会消耗比较多的服务器资源,在使用session时应该慎重,当然了,我们也应该使用一些清理动作来去除一些不需要的session来降低资源的无谓消耗。使用Session变量传递值的一般步骤如下: 
    1,在页面里添加必要的控件 
    2,创建可以返回表单的按钮和链接按钮 
    3,在按钮或链接按钮的单击事件里,把控件的值添加到session变量里 
    4,使用Response.Redirect方法重定向到另一个页面 
    5,在另一个页面提取session的值,在确定不需要使用该session时,要显式清除它 
    下面的代码片断演示了如何实现这个方法: 
    源页面代码: 
    private void Button1_Click 
    (object sender, System.EventArgs e) 

    //textbox1 and textbox2 are webform 
    //controls 
    Session["name"]=TextBox1.Text; 
    Session["email"]=TextBox2.Text; 
    Server.Transfer("anotherwebform.aspx"); 

    目标页面代码: 
    private void Page_Load 
    (object sender, System.EventArgs e) 

    Label1.Text=Session["name"].ToString(); 
    Label2.Text=Session["email"].ToString(); 
    Session.Remove("name"); 
    Session.Remove("email");
     
    }

    使用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 = Request.Cookies[ "myCookie" ].Value; 
    }


    使用Server.Transfer


    使用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在服务器端完成,不需要客户端提出请求,减少了客户端对服务器端提出请求。
    (3)Server.Transfer只能够转跳到本地虚拟目录指定的页面,也就是工程项目中的页面,而Response.Redirect则十分灵活,可以跳转到任何URL地址。 
    (4)Server.Transfer可以将前一个页面的各种类型的值传到新的页面;Response.Redirect则只能借助URL中带参数或是结合上面四种办法把各种类型的值传到新的页面。 
    继续我们的Server.Transfer用法。 
    (1)优点和缺点 
    优点: 1.直接在服务器端重定向,使用简单方便,减少了客户端对服务器端提出请求。 
    2.可以传递各种数据类型的值和控件的值。
    缺点: 1.客户端浏览器中的URL地址是不改变,会导致在新的页面可能出现一些意想不到的问题。比如如果源页面和目的页面不在同一个虚拟目录或其子目录下,那么使用相对路径的图片、超链接都会导致错误的指向。
    (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的代码:

    publicstring HelloContextAttribute
    {
    get
    {
    return"Use Attribute: Hello,Context";
    }
    }
    publicstring HelloContextMethod()
    {
    return"Call Method: Hello,Context!";
    }
    publicstring TextBoxValue
    {
    get
    {
    return TextBox1.Text;
    }
    }
    privatevoid 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的代码:

    privatevoid 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中返回文本控件的值

    textBoxValue = Request.Form["TextBox1"];//这个方法多用于用户在控件中输入值后才能获取,但是在程序中给直接TextBox1.Text赋值,
    //那么这个方法将获得空值,在这种情况下需要使用上面的获取方法
    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!");
    }
    }
    }
  • 相关阅读:
    scrapy中selenium的应用
    Django的锁和事务
    redis
    【leetcode】187. Repeated DNA Sequences
    【leetcode】688. Knight Probability in Chessboard
    【leetcode】576. Out of Boundary Paths
    【leetcode】947. Most Stones Removed with Same Row or Column
    【leetcode】948. Bag of Tokens
    【leetcode】946. Validate Stack Sequences
    【leetcode】945. Minimum Increment to Make Array Unique
  • 原文地址:https://www.cnblogs.com/ljan/p/2381968.html
Copyright © 2011-2022 走看看