2011-09-14 2 views
7

중계기의 viewstate, 즉 중계기 내의 컨트롤이 viewstate를 유지하지 못하는 문제가 있습니다.중계기의 viewstate 유지하기

리피터 1 :

나는 다음이

링크 버튼이 페이지에 숨겨진 필드에 저장되어있는 CommandArgument의 값을 클릭
<asp:Repeater ID="rptImages" runat="server"> 
<ItemTemplate> 
    <asp:LinkButton Text="Add" CommandName="Add" CommandArgument=<%# Eval("ID") %> runat="server" /> 
</ItemTemplate> 
</asp:Repeater> 

.

프리젠 테이션 이벤트 처리기가로드 될 때까지 숨겨진 필드 값을 가져올 수 없습니다. 그래서 내 PreRender 이벤트에서 나는 숨겨진 필드의 값을 잡고 같은, 목록 속성에 저장 :

if (!string.IsNullOrEmpty(this.SelectedImageIDsInput.Text)) { 
     this.ImageList.Add(this.SelectedImageIDsInput.Text); 
    } 

을 그리고 목록 속성은 같은 같습니다

public List<string> ImageList { 
    get { 
     if (this.ViewState["ImageList"] == null) { 
      this.ViewState["ImageList"] = new List<string>(); 
     } 
     return (List<string>)(this.ViewState["ImageList"]); 
    } 
    set { this.ViewState["ImageString"] = value; } 
} 

내가 저장 한 후 내 목록 속성에 값은 내가 (다시 PreRender 이벤트 내에서) 내 두 번째 리피터 바인딩 :

this.rptSelectedImages.DataSource = this.LightBoxControl.ImageList; 
this.rptSelectedImages.DataBind(); 

두 번째 중계기는 DropDownList로하고 그 안에 텍스트 상자가 있습니다. 문제는 이러한 자식 컨트롤의 viewstate가 유지되지 않는다는 것입니다. 나는 각각의 포스트 백이있을 때 리피터를 리 바인드하므로 리빌드되어 있다고 추정합니다. 내가 모르는 것은 이걸 어떻게 얻을 수 있느냐는 것입니다. ImageList 속성은 포스트 백시에만 업데이트되므로 분명히 각 포스트 백과 함께 리피터를 다시 바인딩해야합니다.

도움을 주시면 감사하겠습니다.

덕분에 알

답변

13

당신이 리피터를 리 바인드하는 경우 ViewState가로드되기 전에 Init에 그것을 할 필요가있다.

또한 IsPostback 플래그를 확인하고 페이지가 게시되지 않은 경우에만 리피터를 바인딩해야합니다.

는 두 번째 중계기가 다음 ViewState이 컨트롤을 유지하는 데 사용할 수 없습니다 PreRender에 바인딩 된 경우 단순히 ViewState이로드 될 때 존재하지 않기 때문에, 명확히하기 위해 - Init 후, 그리고 PreLoad 전에.

Init에서 바인딩 할 목록에 액세스 할 수 있도록 모든 다시 게시를 바인딩하거나 Session에 저장하거나 목록에 저장해야합니다 (변경시).

+0

안녕 CodeKing : 당신은 당신이 좋아 LinkButtonClick 이벤트를 처리 할 수 ​​있습니다. 거기에 두 가지 문제가 - 초기화 이벤트 초기에 숨겨진 필드의 값을 얻을 수 없습니다 - 더하기 ImageList 속성을 경우에만 다시 게시 할 수 있습니다 ..... – higgsy

+0

그런 경우에는 두 번째 리피터 다시 바인딩해야 할 것입니다 숨겨진 필드의 값을 사용하여 모든 통화에 대해 – TheCodeKing

+0

안녕하세요 CodeKing - 정확히 내가하고있는 일은 그게 아니야? 당신의 대답을 오해하고 있습니다. 나는 현재 숨겨진 필드의 값을 얻기 위해 onprerender를 기다렸다가 리피터를 다시 바인드한다 -이 문제는 리피터의 컨트롤의 viewstate가 포스트 백을 통해 지속되지 않는다 ... – higgsy

0

CommandArgument 속성을 숨겨진 필드에 복사 할 시점이 없습니다. 당신이해야 할 일은 Repeater에서 ItemCommand 이벤트를 사용하고 이벤트 버블 링을 사용하는 것입니다.

repeater.ItemCommand += (sender, eventArgs) => { 
    var commandArgument = eventArgs.CommandArguments; 
    ImageList.Add(commandArgument); 
    rptSelectedImages.DataSource = ImageList; 
    rptSelectedImages.DataBind(); 
} 
+0

안녕하세요, Mikael - 나는 숨겨진 필드에 그것을 복사하는 것이 미묘하다는 것을 알고 있습니다. 문제는 또한 동일한 페이지에 jQuery 이미지를 업로드 한 것입니다. 일단 파일이 업로드되면 핸들러는 새로운 ImageId를 반환합니다. 물론 JS는 ImageList.Add를 호출 할 수 없으므로 숨겨진 필드에 저장해야합니다. 말이 돼? – higgsy