2011-01-10 1 views
1

HiddenField 자식 컨트롤의 인스턴스가있는 부모 컨트롤이 있습니다. CreateChildControls()를 사용하여 추가하고 있습니다. 모든 것은 필드에 추가되는 값을 포함하여 클라이언트 측에서 작동합니다. 그러나 포스트 백에 필드에 대한 참조가숨겨진 필드가 부모 사용자 지정 컨트롤 내에서 포스트 상태에서 뷰 상태에서로드되지 않는다

널 여기 코드 나는 단지의 ViewState에 의존 시도

protected override void CreateChildControls() 
    { 
     assignedListField = new HiddenField(); 
     assignedListField.ID = ClientID + "_HiddenAssignedList"; 
     assignedListField.EnableViewState = true; 

     Controls.Add(assignedListField); 
     base.CreateChildControls(); 
    } 

    public IList<DlpItem> GetAssignedItems() 
    { 
     //assignedListField = FindControl(ClientID + "_HiddenUnassignedList") as HiddenField; 
     var TmpAssignedItems = new List<DlpItem>(); 
     var list = assignedListField.Value; 
     var items = list.Split(new string[] { "#" }, StringSplitOptions.RemoveEmptyEntries); 
     foreach (var item in items) 
     { 
      var mix = item.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); 
      var text = mix[0]; 
      var id = int.Parse(mix[1]); 
      TmpAssignedItems.Add(new DlpItem(text, id)); 
     } 
     return TmpAssignedItems; 
    } 

입니다 ... 다음도()의 FindControl를 사용하려고했습니다. 어느 쪽도 작동하지 않습니다, 그것은 null 참조로 올 것입니다 ... 여기에 무슨 일이 일어날 지에 대한 어떤 의견입니까?

답변

3

@Sebastian에 따르면 컨트롤을 사용해야하는 경우 사용할 수 없기 때문에 null 일 수 있습니다. 그러나 EnsureChildControls를 호출하여 컨트롤 컬렉션을 만들고 그 컨트롤 컬렉션을 보장 할 수 있습니다. 여기에는 ViewState의로드가 포함되지 않습니다.

그러나 클라이언트 측 작업이 데이터에 영향을주는 경우 viewstate를 사용할 수 없습니다. 당신이해야 할 일은 IPostBackDataHandler를 구현하는 것이다. LostPostData에서 숨겨진 변수를 확인해야합니다. postCollection [ClientID + "_HiddenAssignedList"]을 사용하면 서버에 게시 된 문자열 값을 가져 와서 결과를 처리 할 수 ​​있습니다.

HTH.

+0

어리석은 실수. EnsureChildControls()를 호출하는 것을 잊어 버렸습니다 ... 저는 이미 제 코드에서 그렇게 생각했습니다. 그게 해결책이었습니다. 감사 = D –

0

ViewState가로드 될 때 CreateChildControls()이 아직 호출되지 않았을 가능성이 큽니다 (아마도 ControlState가 더 유용 할 것입니다).

실행주기는 http://msdn.microsoft.com/en-us/library/aa719775%28vs.71%29.aspx을 참조하십시오.

당신은 저장 (부하)을 LoadViewState (SaveViewState) -method (http://msdn.microsoft.com/de-de/library/system.web.ui.control.loadviewstate.aspx)를 사용하여 상태 및 CreateChildControls()가 호출 될 때까지 필드 '의 값을 저장할 수 있습니다.