如何将泛型集合从一个页面传递到另一个页面

本文关键字:一个 另一个 泛型 集合 | 更新日期: 2023-09-27 18:02:08

我在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);
    }

在第二页。aspx,我有

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

我知道,它返回一个字符串(System.Collections.Generic)。

我怎么能得到对象返回Page2.aspx?

注意:~我不能使用Session(这是一个限制)。还有其他的机制吗?

谢谢。

如何将泛型集合从一个页面传递到另一个页面

在这种情况下,我们可以在Server中使用HttpContext。转移

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

另外,尝试viewstate与跨页面post back

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

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

参见对象序列化

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

2-使用内存流

序列化对象图

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

4-获取保存对象的ID

5-传递ID为QueryString

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

如果使用应用程序对象,它可能会丢失,如果你的工作进程回收,如果它是可预期的使用,那么使用应用程序对象,但不要忘记删除对象,当你不需要它。

编辑:我很抱歉。我没有读到你问题的结尾。是否可以使用ViewState?

老答:

可以使用Session

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>;
        }
    }
}

您可以使用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"];
 }

我们可以使用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);
                    }
                }  
            }
        }

如果您能够使用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对象而不需要序列化。