如何将通用集合从一个页面传递到另一个页面?

时间:2013-03-05 06:20:39

标签: c# asp.net

我在Asp.net工作。

在Page1.aspx中,我有

protected void Page_Load(object sender, EventArgs e)
    {
        List<Person> lstPerson = new List<Person>();
        lstPerson.Add(new Person { Name = "N1", Age = 20 });
        lstPerson.Add(new Person { Name = "N2", Age = 30 });      

        Response.Redirect("Page2.aspx?Param=" + lstPerson);
    }

在Page2.aspx中,我有

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            if (Request.QueryString["Param"] != null)
            {
                var xx = Request["Param"];
            }
        }
    }

我知道,它返回一个字符串(System.Collections.Generic.List`1 [Person]表示xx值)。

如何在Page2.aspx中找回对象?

N.B.~我不能使用Session(这是一个限制)。但是其他任何机制都可以吗?

感谢。

6 个答案:

答案 0 :(得分:2)

在这种情况下,我们可以将HttpContext与Server.Transfer一起使用

http://odetocode.com/articles/111.aspx

另外,尝试使用跨页回发的viewstate

http://www.codeproject.com/Articles/37753/Access-ViewState-Across-Pages

答案 1 :(得分:0)

如果你不能使用session,那么序列化你的对象,存储到一些存储中并在页面加载时将其序列化

请参阅object Serialization

1-在数据库中创建一个表,其中至少有两列用于ID(可以自动生成),另一列用于将对象图存储为BLOB

2-使用内存流

序列化对象图

3-将对象图保存到步骤1中创建的表中

4-获取已保存对象的ID

5-将ID传递给QueryString

6-在其他页面上检索ID,从DB加载对象图并反序列化以获取对象。

如果使用Application对象,如果您的工作进程被回收并且如果它可以使用,那么它可能会丢失,然后使用Application对象但不要忘记在不需要时删除该对象。

答案 2 :(得分:0)

编辑:对不起。我没有读到你问题的结尾。是否可以使用ViewState?

旧回答:

您可以使用会话

protected void Page_Load(object sender, EventArgs e)
{
    List<Person> lstPerson = new List<Person>();
    lstPerson.Add(new Person { Name = "N1", Age = 20 });
    lstPerson.Add(new Person { Name = "N2", Age = 30 });      

    Response.Redirect("Page2.aspx?Param=" + lstPerson);

    Session["listOfPersons"] = lstPerson;
}

在Page2.aspx

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        if (Session["listOfPersons"] != null)
        {
            List<Persons> personList = Session["listOfPersons"] as List<Persons>;
        }
    }
}

答案 3 :(得分:0)

您可以使用Application将列表从一个页面传递到另一个页面

见这个例子:

<强> Page1.aspx的

List<Person> lstPerson = new List<Person>();
lstPerson.Add(new Person { Name = "N1", Age = 20 });
lstPerson.Add(new Person { Name = "N2", Age = 30 });

Application.Add("Persons", lstPerson);

Response.Redirect("Page2.aspx");

<强> Page2.aspx

 if (Application["Persons"] != null)
 {
    List<Person> lstPerson = (List<Person>)Application["Persons"];
 }

答案 4 :(得分:0)

我们可以使用HTTP上下文作为

第1页

protected void Page_Load(object sender, EventArgs e)
        {
            var lstPerson = new List<Person>();
            lstPerson.Add(new Person { Name = "N1", Age = 20 });
            lstPerson.Add(new Person { Name = "N2", Age = 30 });

            Context.Items["WebForm1List"] = lstPerson;

            Server.Transfer("Page2.aspx");

        }
第2页

 protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
               var list = Context.Items["WebForm1List"] as List<Person>;

                if (list != null)
                {
                    foreach (Person s in list)
                    {
                        Response.Write(s.Name + "__" + s.Age);
                    }
                }  
            }
        }

答案 5 :(得分:0)

如果您可以使用Server.Transfer("Page2.aspx")代替Response.Redirect,则可以使用第二页上的PreviousPage对象从第一页传输数据。

因此,在Page1.aspx.cs上,将List<Person> lstPerson设为公共类字段。

然后在Page2.aspx.cs中,将此代码的C#等价物添加到Page_Load事件处理程序(对不起VB,我不知道C#语法):

        If Not IsPostBack Then
            If Not PreviousPage Is Nothing Then
               Dim pp As Page1 = DirectCast(PreviousPage, Page1)
               Dim lstPerson as List (of Person) = pp.lstPerson 
               ' use lstPerson as needed...
            End If
        End If

这种方法的好处在于您可以使用任何.NET对象而无需序列化。