.net页面间的参数传递简单实例

来源:互联网 发布:httpclient 性能优化 编辑:程序博客网 时间:2024/05/16 06:03
 net页面间的参数传递简单实例

 使用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");

  }  

  使用Server.Transfer

  这个方法相比上面介绍的方法稍微复杂一点,但在页面间值传递中却是特别有用的,使用该方法你可以在另一个页面以对象属性的方式来存取显露的值,当然了,使用这种方法,你需要额外写一些代码以创建一些属性以便可以在另一个页面访问它,但是,这个方式带来的好处也是显而易见的。总体来说,使用这种方法是简洁的同时又是面向对象的。使用这种方法的整个过程如下:

  1,在页面里添加必要的控件

  2,创建返回值的Get属性过程

  3,创建可以返回表单的按钮和链接按钮

  4,在按钮单击事件处理程序中调用Server.Transfer方法转移到指定的页面

  5,在第二个页面中,我们就可以使用Context.Handler属性来获得前一个页面实例对象的引用,通过它,就可以使用存取前一个页面的控件的值了

  以下代码综合实现上述步骤过程的代码:

源页面代码:

  把以下的代码添加到页面中

  public string Name

  {

  get

  {

  return TextBox1.Text;

  }

  }  

  public string EMail

  {

  get

  {

  return TextBox2.Text;

  }

  }

  然后调用Server.Transfer方法

  private void Button1_Click

  (object sender, System.EventArgs e)

  {

  Server.Transfer("anotherwebform.aspx");

  }

  目标页面代码:

  private void Page_Load

  (object sender, System.EventArgs e)

  {

  //create instance of source web form

  WebForm1 wf1;

  //get reference to current handler instance

  wf1=(WebForm1)Context.Handler;

  Label1.Text=wf1.Name;

  Label2.Text=wf1.EMail;

  }
  

  在ASP.NET 2.0中启用了跨页面传送功能,其功能和用法在以后在做介绍!  

  页面之间传递值  

  方式1:  

  在接收页 的html代码里加上一行:   

  WebForm1 fp=(WebForm1)Context.Handler;

  this.TextBox1.Text=fp.name; //name 是第一页的public变量  

  Context 提供对整个当前上下文(包括请求对象)的访问。您可以使用此类共享页之间的信息。

  方式2:GET方式

在发送页

   public int sum=0;  

   int i =int.Parse(this.TextBox1.Text)*2;  

   Server.Transfer("WebForm2.aspx?sum="+i);  

   接收页

   this.TextBox1.Text=Request["sum"].ToString();

   or this.TextBox1.Text=Request.Params["sum"].ToString();

   this.TextBox1.Text=Request.QueryString["sum"];
  

  方法3:全局变量  

   发送页:

   Application["sum"]=this.TextBox1.Text;

   Server.Transfer("WebForm2.aspx");  

   接收页:

   this.TextBox1.Text=(string)Application["sum"];  

  Application实质上是整个虚拟目录中所有文件的集合,如果想在整个应用范围内使用某个变量值,Application对象将是最佳的选择  

  在这里用Session[""]的方法雷同  

  方法4:

   发送页:

   1.定义静态变量: public static string str="";

   2. str=this.TextBox1.Text;

   Server.Transfer("webform2.aspx");

   接收页:

   1.引入第一页的命名空间:using WebApplication1;

   2 this.TextBox1.Text=WebForm1.str;

使用Form:

Querystring适合传递少量文本数据,比较灵活,不过它缺乏保密性,很多时候会在地址栏中显示出来,另外它也不适合传递大量数据和对象。Form正好相反,非常适合传递大量比较复杂的数据,例如大量的文本内容、文件、图形,等等。在ASP.NET 1.x的服务器表单中,服务器控件的事件处理都是用表单提交来实现的,不过所有的服务器表单提交都是提交到当前页面,如果想提交到另外一页可以用Server.Transfer(http://localhost/test.aspx)来实现。 ASP.NET 2.0有了新的武器,那就是跨页面提交,这可以在不使用Server.Transfer的情况下使服务器表单中的内容可以直接提交到另一个aspx页面。

先来看看跨页面传送是怎么使用的。

Default.aspx:

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server"><title>Untitled Page</title></head>

<body><form id="form1" runat="server">

     <div><asp:TextBox ID="TextBox1" runat="server"></asp:TextBox><br/>

          <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>&nbsp;<br />

          <asp:Button ID="Button1" runat="server" Text="提交到print.aspx"/>

          <asp:Button ID="Button2" runat="server" Text="提交到store.aspx" PostBackUrl="~/store.aspx" /></div></form>    

</body></html>

Default.aspx.cs:

public partial class _Default : System.Web.UI.Page{

protected void Page_Load(object sender, EventArgs e){

             if (!IsPostBack){       

             TextBox1.Text = "第一页";

                      TextBox2.Text = "第二页";

             }       

             else

                 Server.Transfer("print.aspx");

     }

}

Print.aspx.cs:

public partial class Print : System.Web.UI.Page{

     protected void Page_Load(object sender, EventArgs e){      

         if (this.PreviousPage != null){

             TextBox tb=(TextBox)this.PreviousPage.FindControl("TextBox1");

             Response.Write(tb.Text);

         }

     }

}

Store.aspx.cs

public partial class Store : System.Web.UI.Page{

     protected void Page_Load(object sender, EventArgs e){

         if (this.PreviousPage != null){

             TextBox textBox=(TextBox)this.PreviousPage.FindControl("TextBox2");

             if (textBox != null)

                 Response.Write(textBox.Text);

         }

     }

}

注意Button2的PostBackUrl属性,当Button2被按下以后,页面就被提交到store.aspx,然后Store.aspx的页面对象通过PreviousPage属性查找default.aspx的服务器控件和提交的内容。很简单,只要给提交按钮的PostBackUrl指定相应的URL,表单就会被自动提交到对应的页面。

这里发现按下Button1以后,页面同样会通过Server.transfer提交到Print.aspx,而且Print.aspx也同样可以通过PreviousPage查找default.aspx服务器表单中的内容。那么使用PostBackUrl和Server.Transfer来传送页面有什么不同呢? 回到Button1&2被按下的时刻,当Button1被按下,页面被提交给自己,然后根据页面生命周期的顺序,从PreInit事件开始,一步一步执行,直到到达Page_Load事件方法中的Server.Transfer操作,然后页面转到Print.aspx进行处理。当Button2被按下的时候,事情就不那么一样了。Button2具有PostBackUrl属性,Button2被按下以后就会被直接提交给Store.aspx,default.aspx不再按照页面生命周期的顺序执行。用MSDN上的话讲就是:Server.Transfer是一个基于服务器的方法,而PostBackUrl是基于客户端的。从这个意义上来讲,跨页面传送比Server.Transfer更加的便捷,有利于提高服务器的性能,减少了处理步骤。除开这一点,两者还是非常相似的,不过在ASP.NET 2.0中,跨页面传送显然是更好的选择。

如果要在后续页面中判断PerviousPage所引用的页面是通过跨页面提交而来的还是通过Server.Transfer方法传送而来的,可以通过IsCrossPagePostBack属性来进行判断:

if(PreviousPage != null){

     if(PreviousPage.IsCrossPagePostBack == true)     {

     Response.Write("Cross-page post.");

     }

}

else {

     Response.Write("Not a cross-page post.");

}

除了源页面的服务器控件内容以外,还可以在目标页面中访问源页面对象的公有属性和成员变量。在能得到源页面的公有成员之间,必须首先在目标页面添加对源页面的强类型引用,在<%@ Page …%>下面加入一行: <%@ PreviousPageType VirtualPath="~/Default.aspx"%>。现在就可以在目标页面直接访问源页面的公有成员了。例如下面这个例子,显示了一个公有属性成员Birthdate。

Default.aspx.cs:

public DateTime Birthdate

{

     get{ return new DateTime(1980,3,17);}

}

假设Default.aspx 通过跨页面传送提交给了Target.aspx,那么可以在target.aspx中访问Birthdate属性:

TextBox1.Text=this.PreviousPage.Birthdate.ToString();

跨页面传送的特性大概就是这些,有了跨页面传送,在处理数据提交的时候就又多了一种方法,更加的灵活。有人大概认为,使用跨页面提交会增加页面间的耦合程度,会增加数据传送量,使用querystring和传统的Form就够了。其实和传统的Form提交方法相比,页面间的耦合程度并没有提高。原因是当Form的内容提交以后,还是同样需要知道Input控件的ID才能访问对应的值,并且它有利于将不相关的功能页面分离。

举个例子来讲:现在有一个表单,里面填写了用户注册的信息,开发人员想为这个表单的内容做两件事,一件是将表单的内容存入数据库,另一件是将表单的内容发送给打印预览页面进行打印预览。ASP.NET 1.x中的方法是,提供两个服务器按钮控件,然后将表单内容提交给当前页面,当前页面进行条件判断,然后Server.Transfer到相应的页面进行处理。如果使用跨页面传送功能,同样先提供两个服务器按钮控件,可以为每个按钮指派对应的PostBackUrl,这样页面的内容就可以直接被提交到不同的页面,避免了在当前页面代码中出现更多的条件判断,减少了Server.Transfer的使用,不仅优化了设计也提高了效率。

原创粉丝点击