2010-09-14 55 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