0

我在 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] for xx 值)。

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

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

谢谢。

4

6 回答 6

2

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

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

另外,尝试使用跨页回发的视图状态

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

于 2013-03-05T06:34:35.907 回答
0

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

参见对象序列化

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

2- 使用内存流序列化对象图

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

4-获取保存对象的ID

5- 将 ID 作为 QueryString 传递

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

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

于 2013-03-05T06:23:38.480 回答
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>;
        }
    }
}
于 2013-03-05T06:30:17.467 回答
0

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

看这个例子:

第1页.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"];
 }
于 2013-03-05T06:34:00.730 回答
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);
                    }
                }  
            }
        }
于 2013-03-05T07:32:07.340 回答
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 对象而无需序列化。

于 2013-03-05T14:04:05.243 回答