2012-10-08 3 views
1

여기에서 발생하는 수명주기를 이해하려고합니다. 항목 ID를 가져 와서 목록에 쓸 수있는 asp 목록보기가 있습니다. 내 목록이 방법 후C# 단추를 클릭 한 후 항목이 비어 있음

private List<int> CurrentList = new List<int>(); 

외부에서 정의

protected void ShareWith_OnItemBound(object sender, ListViewItemEventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      if (e.Item.ItemType == ListViewItemType.DataItem) 
      { 
       ListViewDataItem currentItemId = (ListViewDataItem)e.Item; 
       System.Web.UI.WebControls.DataKey currentDataKey = this.lvShareWithPanel.DataKeys[currentItemId.DataItemIndex]; 
       int FriendId = Convert.ToInt32(currentDataKey["SharedUserId"]); 
       CurrentList.Add(FriendId); 
      } 
     } 
    } 

, 사용자는 계속하여 ASP 버튼을 클릭하여 목록에 새로운 항목을 추가합니다. 현재 목록과 새로운 목록을 비교하고 있지만 버튼 클릭 후 디버그를 관찰하면 목록 "CurrentList"가 비어 있습니다. 어떤 방법 밖에있는 목록이 영향을받는 이유는 무엇입니까?

+0

CurrentList를 static으로 선언했는지 확인하십시오. 이게 작동하는지 알려주세요. – mihirj

+2

@mihirj 나쁜 조언이야! ASP.NET은 다중 스레드 환경이며 모든 스레드에서 정적 필드를 공유합니다. 목록을 정적으로 정의한 – thorn

+0

이 작동했습니다. 멀티 스레딩에 대해 많이 알지 못하기 때문에이를 수행 할 때 발생할 수있는 반향은 무엇입니까? –

답변

3

목록에 상태 값이 없습니다. 따라서 ViewState, Session 상태 또는 다른 방법으로 목록을 저장해야합니다.

모든 ASP.NET 페이지는 페이지로드 사이의 값을 잃어 버리고 상태에서 또는 언제든지 입력하면 다시 가져옵니다. 대부분의 컨트롤은 페이지 고유의 ViewState에 값을 저장합니다. This link 도움이됩니다.

2

모든 페이지의 객체를 이해하는 도움을

감사는 페이지의 라이프 사이클의 마지막에 배치됩니다. 따라서 모든 포스트 백에서 목록을 작성하고 채울 필요가 있습니다 (또는 Session에 저장하는 것이 좋습니다).

당신은 모든 이벤트가 이미 트리거되도록 페이지의 PreRender 이벤트를 사용할 수 있습니다 누군가가 댓글을 달았습니다 당신이 그것을 static해서는 안

protected override void OnPreRender(EventArgs e) 
{ 
    // why do you need a list as field variable at all? I assume a local variable is fine 
    List<int> CurrentList = new List<int>(); 
    foreach(var currentItemId in lvShareWithPanel.Items) 
    { 
     System.Web.UI.WebControls.DataKey currentDataKey = lvShareWithPanel.DataKeys[currentItemId.DataItemIndex]; 
     int FriendId = Convert.ToInt32(currentDataKey["SharedUserId"]); 
     CurrentList.Add(FriendId); 
    } 
    // do something with the list 
} 

참고. 즉 모든 사용자와 모든 요청에 ​​대해 동일한 "인스턴스"를 사용하게됩니다.

는 여기에서 모든 이벤트를 볼 수 있습니다

enter image description here

+0

매우 유익합니다. 나는 너의 접근 방식을 시도 할 것이다. 나는 실제로 이와 같은 일을 고려하고 있었지만 처음에는 listview 컨트롤에서 사용할 수있는 것들로 시도하려고했습니다. –

2

ASP.NET 따라서 데이터를 다시 게시하는 동안 손실, 입니다. 예 : CurrentList을 수동으로 추적해야합니다. 세션/ViewState에서.

public List<int> CurrentList 
{ 
    get 
    { 
     return (List<int>)Session["CurrentList"] ?? new List<int>(); 
    } 
    set 
    { 
     Session["CurrentList"] = value; 
    } 
} 
0

목록을 ViewState 및 PageLoad 이벤트에 저장하고 ViewState에 저장된 List를 클래스 수준 List에 할당 할 수 있습니다. 이는 개체가 폐기 된 페이지 수명주기 때문에 발생합니다.

관련 문제