2009-11-20 3 views
6

Dans mon application ASP.NET, je suis en train de charger un .ascx dynamiquement à l'aide LoadControl, en utilisant le schéma suivant:Viewstate de ascx perdu entre postbacks

var ctrl = LoadControl("/path/to/control.ascx"); 
((ControlType)ctrl).SomeProperty = someData; 
placeholder.Controls.Add(ctrl); 

Le contrôle que j'ajoute enregistre la valeur de la propriété SomeProperty directement ViewState, comme suit:

public int? SomeProperty 
{ 
    get { return (int?)ViewState["SomeProperty"]; } 
    set { ViewState["SomeProperty"] = value; } 
} 

Après cela, la vie de contrôle ascx une vie propre et tout va bien jusqu'à ce que postback se produit. Lorsque la page affiche, soudainement l'état d'affichage est vide! Je suppose que cela se produit parce que je manipule le ViewState avant d'ajouter le ascx instancié à ma page. De plus, je peux empêcher la ViewState de se perdre en ajoutant la ligne suivante dans la méthode Page_Load() de mon contrôle ascx:

SomeProperty = SomeProperty; 

que je dois faire ce qui précède pour chaque propriété pour faire en sorte que le ViewState est préservée. Maintenant, y a-t-il une façon plus jolie de faire cela? Manipuler le ViewState après l'ajout du fichier .ascx instancié à la page n'est pas une option - J'ai besoin du contenu de ViewState dans les méthodes Page_Init() et Page_Load(), qui sont déclenchés dès que j'ajoute le fichier .ascx à ma page.

Merci.

+0

J'ai rencontré un problème similaire une fois, et dans mon cas le problème était que dans notre page de base de tous les temps, nous avons défini tous les contrôles pour ne pas utiliser viewstate. Mon point est que l'ajout de contrôles dynamiquement pourrait ne pas être nécessairement le problème, mais des endroits cachés où viewstate est mis à désactivé. –

Répondre

13

Jetez un oeil à la ASP.NET Page Life Cycle et Understanding View State. View State est chargé après l'initialisation, vous ne pourrez donc pas y accéder dans Page_Init. Vous feriez mieux d'utiliser un champ caché.

Si vous ne pouvez plus utiliser View State, le plus tôt possible est de surcharger la méthode LoadViewState (N'oubliez pas d'appeler le base.LoadViewState avant d'essayer d'y accéder).

+0

+1 bonnes références avec explication –

+0

Merci, ça l'a éclairci. Je suis dans un dilemme maintenant, cependant: j'ai besoin de créer des contrôles dans Page_Init, en fonction du contenu de l'état d'affichage (ou du champ caché, d'ailleurs, qui ne semble pas être chargé dans Page_Init non plus). –

+0

Ohh si vous allez avec l'approche Champ caché, vous devrez regarder dans Request.Forms pour la valeur. Le contrôle serveur réel ne sera pas encore chargé. Essayez ça. – Bob

1

Gardez une trace de l'ID du UserControl avant postback puis sur postback recréez le contrôle et attribuer l'ID de retour et il devrait charger automatiquement le ViewState avant.

+0

Oh, ouais, j'ai oublié de dire ça. En fait, je recréer le contrôle de l'utilisateur sur chaque publication, et je m'assure que l'ID est le même à chaque fois. Le problème n'est pas que ViewState ne peut pas être restauré, c'est que les modifications apportées à l'état viewState entre LoadControl et placeHolder.Controls.Add ne sont pas conservées sauf si je répète explicitement les modifications après que le contrôle a été ajouté à la page. –

3

Vous devez également ajouter le contrôle à la collection de contrôles AVANT de définir la propriété. ViewState n'est pas enregistré avant d'avoir été ajouté à la collection de contrôles.

placeholder.Controls.Add(ctrl); 
((ControlType)ctrl).SomeProperty = someData; 
Questions connexes