2009-03-19 5 views
0

J'ai un contrôle composite lié aux données qui héberge un IBindableTemplate et charge dynamiquement un balisage basé sur une condition dans le contrôle. Maintenant, lorsque ces contrôles enfant sont chargés dans le contrôle composite et la publication est là, je perds viewstate des contrôles enfants. Y at-il un moyen, je peux enregistrer viewstate des contrôles enfants sur la publication?Comment gérer l'état d'affichage des contrôles enfants placés sur un modèle pouvant être lié dans un contrôle personnalisé composite?

Je réf. à l'explication de Scott en utilisant http://scottonwriting.net/sowblog/posts/2129.aspx; mais d'aucune utilité.

Répondre

0

Votre code théorique est presque proche de ma situation avec une seule différence majeure que je ne tends pas ma classe de modèle à partir IBindable en tant que telle plutôt Je fournis les contrôles pour les modèles dans le balisage lui-même qui est l'exigence.

Scott aussi, il est clair que si l'on ajoute les commandes à le modèle comme vous avez fait

  #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 

alors l'état d'affichage sera persisté automatiquement sur chaque postback. Tout ce dont j'ai besoin est de permettre à mes templates d'être instanciés dans le balisage et de persister encore viewstate en postback et de me permettre de récupérer le statut de contrôle même si j'ai l'habitude de redémarrer le template avec des données différentes.

0

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 
} 
+0

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. –

+0

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

Questions connexes