2010-09-14 2 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); 
} 

Я хочу, чтобы добавить элемент в список каждый раз, когда кнопка Добавить будет нажата, но список сбрасывается после каждого постбэк , Как сохранить данные в списке между postbacks?

ответ

8

Я часто использую технику, как это, хотя имейте в виду, что это может привести к тому ViewState (оказанной в браузер) расти довольно большой:

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 
} 

также обратите внимание, что ваш класс Event необходимо будет сериализации, но это, как правило, так же просто, как добавление [Serializable] атрибут к классу (если его действительно сложный класс).

+1

Вам не нужно назначать список событий обратно в свойство Events, вы работаете со ссылками. Это тот же список. –

+0

@Alex Reibort: На самом деле, вы в дешифраторе вы десериализуете экземпляр списка из состояния представления, в сеттере вы сериализуете экземпляр обратно в состояние представления. Экземпляр в коде один и тот же, но он исчезает между сообщениями обратной связи, вам нужно обновить состояние представления после его изменения. – CodingGorilla

+0

Нет, нет. ViewState удерживает десериализует его содержимое до того, как вы попросите список, поэтому он держит ссылку на список, когда вы обращаетесь к нему, вы возвращаете ссылку, чтобы обновить экземпляр, и он будет автоматически сохранен в viewstate. Просто проверьте это. –

1

Вам нужно будет как можно скорее сохранить список. Вы можете занести его в ViewState, нажать его в базу данных, сохранить его в сеансе, поместить в HiddenField на странице ...

+0

что? Список объектов в HiddenField? – JoshYates1980

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 
Смежные вопросы