2010-09-14 62 views
5

之間泛型列表下面是在我的代碼隱藏:保持回發

List<Event> events = new List<Event>(); 

protected void Page_Load(object sender, EventArgs e) 
{ 

} 

protected void AddEvent_Click(object sender, EventArgs e) 
{ 
    Event ev = new Event(); 

    ev.Name = txtName.Text; 

    events.Add(ev); 
} 

我希望每次添加按鈕被點擊時的項目​​添加到列表中,但列表每回發後重置。我如何將數據保存在回傳之間的列表中?

回答

8

我經常使用的技術,像這樣,不過請注意,這可能會導致您的視圖狀態(如呈現到瀏覽器)增長相當大的:當你要使用的列表中,您

public List<Event> Events 
{ 
    get { return (List<Event>)ViewState["EventsList"]; } 
    set { ViewState["EventsList"] = value; } 
} 

然後會做這樣的事情:

public void AddToList() 
{ 
    List<Event> events = Events; // Get it out of the viewstate 
    ... Add/Remove items here ... 
    Events = events; // Add the updated list back into the viewstate 
} 

另外請注意,您的事件類將需要可序列化,但是這通常是添加[Serializable]屬性的類(除非它是一個非常複雜的類)一樣簡單。

+1

您不必將事件列表分配回事件屬性,即使用引用。這是同一個列表。 – 2010-09-14 15:22:54

+0

@Alex Reibort:實際上你是這樣做的,在getter中,你要將列表實例從視圖狀態反序列化,在setter中你將實例序列化回到視圖狀態。代碼中的實例是相同的,但在後發之間消失,您需要在更改後刷新視圖狀態。 – CodingGorilla 2010-09-14 15:27:35

+0

不,你不知道。 ViewState在你請求列表之前保持反序列化它的內容方式,所以它在你訪問列表時持有對列表的引用,你取回引用,並用它來更新實例,並且它會自動保存到viewstate中。只是測試它。 – 2010-09-14 15:54:54

1

您需要以某種方式自己維護列表。你可以將它塞進ViewState,將它推送到數據庫,將它存儲在Session中,將它放到頁面上的HiddenField中...

+0

是什麼?在HiddenField中列出對象? – JoshYates1980 2017-08-24 18:20:52

1

將列表保存到會話或視圖狀態。

protected void AddEvent_Click(object sender, EventArgs e) 
{ 
    Event ev = new Event(); 

    ev.Name = txtName.Text; 
    if(Session["events"] == null) 
    { 
     Session["events"] = new List<Event>(); 
    } 
    var events = (List<Event>)Session["events"]; 
    events.Add(ev); 
} 
0

感謝CodingGorilla,這解決了我的問題。但我必須爲新手增加一件事。

List<Event> events = Events; // Get it out of the viewstate 
**You should check whether events is null** 
Events = events; // Add the updated list back into the viewstate