정보가 충분하지 않습니다. 컨트롤을 언제 만듭니 까? 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
}
컨트롤은 마크 업에 배치되고 일부 비즈니스 논리에 따라 템플릿에서 인스턴스화됩니다. 모든 포스트 백에서 템플릿이 새로운 컨트롤 값 세트로 다시 인스턴스화되고 이전 뷰 상태가 손실되기 때문에 뷰 상태가로드되지 않습니다. –
나는 코드를 보지 않고 말할 수 없다. 이론적 인 상황을 설명하기 위해 답장을 편집했습니다. 나는 그것이 당신과 비슷한 지 모른다. – Ruslan