2009-03-19 2 views
0

저는 IBindableTemplate을 호스팅하고 컨트롤에 일부 조건에 따라 동적으로 마크 업을로드하는 복합 데이터 바인딩 컨트롤을 사용했습니다. 이제 이러한 자식 컨트롤이 복합 컨트롤에로드되고 다시 게시 될 때 자식 컨트롤의 viewstate가 손실됩니다. 방법이 있습니까, 내가 postback에 자식 컨트롤의 viewstate 저장할 수 있습니까?복합 사용자 정의 컨트롤에서 바인딩 가능한 템플릿에 배치 된 하위 컨트롤의 뷰 상태를 처리하는 방법은 무엇입니까?

또한 추천. 스콧의 설명에 http://scottonwriting.net/sowblog/posts/2129.aspx; 그러나 아무 소용이 없습니다.

답변

0

귀하의 이론적 코드는 거의 차라리 같은 IBindable에서 내 템플릿 클래스를 확장하지 않는 하나의 큰 차이와 내 상황에 가까운 요구 사항 인 마크 업 자체의 템플릿에 대한 컨트롤을 제공합니다.

우리는 당신이 다음

  #region ITemplate Members 
     public void InstantiateIn(Control container) 
     { 
      Label label = new Label(); 
      label.Text = "Label"; 
      container.Controls.Add(label); 

      TextBox textbox = new TextBox(); 
      container.Controls.Add(textbox); 
     } 
     #endregion 

했을 뷰 상태가 자동으로 모든 게시에 지속 될 것 같은 템플릿에 컨트롤을 추가하는 경우 스콧 또한, 분명히 있다고한다. 필요한 것은 템플릿을 마크 업에서 인스턴스화하고 포스트 백의 뷰 상태를 유지하고 다른 데이터로 템플릿을 다시 시작한 경우에도 컨트롤의 상태를 가져올 수 있도록 허용하는 것입니다.

0

정보가 충분하지 않습니다. 컨트롤을 언제 만듭니 까? Controls 컬렉션에 언제 추가합니까? 조건은 무엇이며 포스트 백에서 변경됩니까?

적절한 시점에 컨트롤이 추가되면 viewstate는 페이지 사이클이 끝날 때 자동으로 저장됩니다 (포스트 백 또는하지 않음).

나중에 컨트롤을 추가하는 경우 모든 초기화가 완료된 후에도 너무 늦은 경우가 있습니다. 코드없이

업데이트

이 아래로 휴식이 발생하는 위치 추측하기 어렵다. 어떤 상황에서 컨트롤의 기본을로드 할 수있는 사용자 지정 템플릿이있는 Repeater를 살펴 보겠습니다. 이 샘플은 작동하지만 템플리트 할당이 Page_Load에서 수행 된 경우 실패합니다. 이것은 당신의 상황과 비슷합니까?

형태 :

<div> 
    <asp:Repeater ID="repeater" runat="server" /> 
    <asp:Button ID="submitButton" runat="server" Text="Submit" onclick="submitButton_Click" /> 
    <asp:Button ID="postButton" runat="server" Text="PostBack" /> 
</div> 

코드 :

public partial class _Default : System.Web.UI.Page 
{ 
    protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 
     repeater.ItemTemplate = new MyTemplate(); 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     //however, if I was to move repeater.ItemTemplate = new MyTemplate() here 
     //it would not reload the view state 
     if (!IsPostBack) 
     { 
      repeater.DataSource = new int[] { 1, 2, 3, 4, 5 }; 
      repeater.DataBind(); 
     } 
    } 

    protected void submitButton_Click(object sender, EventArgs e) 
    { 
     submitButton.Text = "Do it again"; 
    } 
} 

public class MyTemplate : IBindableTemplate, INamingContainer 
{ 
    #region IBindableTemplate Members 
    public System.Collections.Specialized.IOrderedDictionary ExtractValues(Control container) 
    { 
     OrderedDictionary dictionary = new OrderedDictionary(); 
     return dictionary; 
    } 
    #endregion 

    #region ITemplate Members 
    public void InstantiateIn(Control container) 
    { 
     Label label = new Label(); 
     label.Text = "Label"; 
     container.Controls.Add(label); 

     TextBox textbox = new TextBox(); 
     container.Controls.Add(textbox); 
    } 
    #endregion 
} 
+0

컨트롤은 마크 업에 배치되고 일부 비즈니스 논리에 따라 템플릿에서 인스턴스화됩니다. 모든 포스트 백에서 템플릿이 새로운 컨트롤 값 세트로 다시 인스턴스화되고 이전 뷰 상태가 손실되기 때문에 뷰 상태가로드되지 않습니다. –

+0

나는 코드를 보지 않고 말할 수 없다. 이론적 인 상황을 설명하기 위해 답장을 편집했습니다. 나는 그것이 당신과 비슷한 지 모른다. – Ruslan

관련 문제