Il n'y a pas assez d'informations. Quand créez-vous des contrôles? Quand les ajoutez-vous à la collection Controls? Quelle est la condition et cela change-t-il en période de publication?
Le viewstate est enregistré automatiquement à la fin du cycle de la page (publication ou non) étant donné que les contrôles sont ajoutés au bon moment.
Si vous ajoutez des contrôles plus tard, dans certains cas après que toute l'initialisation a été effectuée, il est trop tard.
Mise à jour
Sans code, il est difficile de deviner où la décomposition se produit. Examinons un répéteur avec un modèle personnalisé qui pourrait charger la base de contrôle sur certaines conditions. Cet exemple fonctionne, mais il échouerait si l'affectation de modèle a été effectuée sur Page_Load. Est-ce quelque chose de similaire à votre situation?
Forme:
<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>
code:
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
}
Les contrôles sont placés dans le balisage et, selon une logique métier, ils sont instanciés dans le modèle. L'état d'affichage n'est pas chargé, car à chaque publication, le modèle est à nouveau instancié avec un nouvel ensemble de valeurs de contrôle et l'état d'affichage précédent est perdu. –
Je ne peux pas dire sans regarder le code. J'ai édité ma réponse pour illustrer la situation théorique. Je ne sais pas si c'est semblable au tien. – Ruslan