簡體   English   中英

如何將通用集合從一個頁面傳遞到另一個頁面?

[英]How to pass a generic collection from one page to another?

我在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中獲取對象?

NB~我不能使用Session(這是一個限制)。但是任何其他機制都可以嗎?

謝謝。

在這種情況下,我們可以將HttpContext與Server.Transfer一起使用

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

此外,嘗試使用跨頁回發的viewstate

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

如果你不能使用session,那么序列化你的對象,存儲到一些存儲中,並在頁面加載時將其序列化

看到對象序列化

1-在數據庫中創建一個表,其中至少有兩列用於ID(可以自動生成),另一列用於將對象圖存儲為BLOB

2-使用內存流序列化對象圖

3-將對象圖保存到步驟1中創建的表中

4-獲取已保存對象的ID

5-將ID作為QueryString傳遞

6-在其他頁面上檢索ID,從DB加載對象圖並取消序列化以獲取對象。

如果使用Application對象,如果您的工作進程被回收,並且如果它可以表示使用,則它可能會丟失,然后使用Application對象但不要忘記在不需要時刪除該對象。

編輯:對不起。 我沒看完你的問題。 是否可以使用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對象而無需序列化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM