首页 > 代码库 > ASP.NET页面间传值的几种常见方式

ASP.NET页面间传值的几种常见方式

(新建项目WebApplication,添加新项:源页面Default.aspx和目标页面WebForm1.aspx. 在源页面Default.aspx中添加两个TextBox, ID分别为Nametb和Emailtb,两个Label;在WebForm1.aspx中添加两个Label,ID分别为lname和lemail,用于显示TextBox传过来的值.)
1.使用QueryString
使用QueryString在页面间传递值已经是一种很老的机制了,这种方法的主要优点是实现起来非常简单,然而它的缺点是传递的值是会显示在浏览器的地址栏上的(不安全),同时又不能传递对象,但是在传递的值少而安全性要求不高的情况下,这个方法还是一个不错的方案。
    //Default.aspx.cs的部分代码
protected void btn_Click(object sender, EventArgs e)
{
    string url;        url="WebForm1.aspx?name="+nametb.Text+"&email="
+emailtb.Text;
    Response.Redirect(url);
}
//WebForm1.aspx.cs的部分代码
protected void Page_Load(object sender, EventArgs e)
{
lname.Text = Request.QueryString["name"];
lemail.Text = Request.QueryString["email"];
}

2.使用Session变量
使用Session变量是可以在页面间传递值的的另一种方式,在本例中我们把控件中的值存在Session变量中,然后在另一个页面中使用它,以不同页面间实现值传递的目的。但是,需要注意的是在Session变量存储过多的数据会消耗比较多的服务器资源,在使用Session时应该慎重,当然了,我们也应该使用一些清理动作来去除一些不需要的Session来降低资源的无谓消耗。
    //Default.aspx.cs的部分代码
protected void btn_Click(object sender, EventArgs e)
{
         Session["name"] = nametb.Text;
        Session["email"] = emailtb.Text;
    Server.Transfer("WebForm1.aspx");
}
    //WebForm1.aspx.cs的部分代码
protected void Page_Load(object sender, EventArgs e)
    {
        lname.Text = Session["name"].ToString();
        lemail.Text = Session["email"].ToString();
        Session.Remove("name");
        Session.Remove("email");
    }
3.使用Server.Transfer
这个方法相比上面介绍的方法稍微复杂一点,但在页面间值传递中却是特别有用的,使用该方法你可以在另一个页面以对象属性的方式来存取显露的值,当然了,使用这种方法,你需要额外写一些代码以创建一些属性以便可以在另一个页面访问它,但是,这个方式带来的好处也是显而易见的。总体来说,使用这种方法是简洁的同时又是面向对象的。
    //Default.aspx.cs的部分代码
    public string Name
    {
        get
        {
            return nametb.Text;
        }
    }
    public string Email
    {
        get
        {
            return emailtb.Text;
        }
    }
    protected void btn_Click(object sender, EventArgs e)
    {
        Server.Transfer("WebForm1.aspx");
}
//在目标页面WebForm1.aspx(源)中务必在第一句话添加
<%@ Reference Page="~/Default.aspx" %>(或)
<%@ PreviousPageType VirtualPath="~/Default.aspx" %>

//WebForm1.aspx.cs的部分代码
    protected void Page_Load(object sender, EventArgs e)
    {
        //create instance of source web form
        _Default d1;
        //get reference to current handler instance
        d1 = (_Default)Context.Handler;
        lname.Text = d1.Name;
        lemail.Text = d1.Email;
}
4.使用@PreviousPageType指令
这个指令是.net 2.0中的一个新指令,用于处理ASP.NET 2.0提供的跨页面传送新功能.用于批定跨页面的传送过程起始于哪个页面.包含两个属性:
TypeName 设置回送时的派生类名
VirtualPath 设置回送时所传送页面的地址
源页面Default.aspx中有一个TextBox, ID为Nametb,在Default.aspx.cs中设置属性:
    public TextBox Name
    {
        get
        {
             return this.nametb;
        }
}
    protected void btn_Click(object sender, EventArgs e)
    {
        Response.Redirect("WebForm1.aspx");
}
在目标页面WebForm1.aspx(源)的最上方加上:
<%@ PreviousPageType VirtualPath="~/Default.aspx"%>
然后就能引用Default.aspx.cs中定义的属性了
//WebForm1.aspx.cs的部分代码
    protected void Page_Load(object sender, EventArgs e)
    {
        lname.Text = "Hello " + PreviousPage.Name.Text;
}
5. 使用Cookie对象变量
  这个也是大家常使用的方法,与Session一样,是对每一个用户而言的,但是有个本质的区别,即Cookie是存放在客户端的,而Session是存放在服务器端的。而且Cookie的使用要配合ASP.NET内置对象Request来使用。
    //Default.aspx.cs的部分代码
protected void btn_Click(object sender, EventArgs e)
{
         HttpCookie cookie_name = new HttpCookie("name");
        cookie_name.Value = nametb.Text;
        Response.AppendCookie(cookie_name);
        Server.Transfer("WebForm1.aspx");
    }
    //WebForm1.aspx.cs的部分代码
protected void Page_Load(object sender, EventArgs e)
    {
        lname.Text = Request.Cookies["name"].Value.ToString();
    }
6. 使用Application 对象变量
Application对象的作用范围是整个全局,也就是说对所有用户都有效。其常用的方法用Lock和UnLock。
    //Default.aspx.cs的部分代码
protected void btn_Click(object sender, EventArgs e)
{
         Application["name"] = nametb.Text;
        Server.Transfer("WebForm1.aspx");    
    }
    //WebForm1.aspx.cs的部分代码
protected void Page_Load(object sender, EventArgs e)
    {
        Application.Lock();
        lname.Text = Application["name"].ToString();
        Application.UnLock();
    }