Viewstate variable perdu sur le contrôle de l'utilisateur chargés dynamiquement
J'ai un problème avec ViewState. J'ai une page aspx qui a une arborescence sur la gauche et un UpdatePanel avec un ASP.NET intérieur Panneau sur la droite. C'est dans ce Panneau intérieur où je charger et décharger dynamiquement les commandes de l'utilisateur. J'utilise que le panneau de mise à jour de charger dynamiquement des contrôles.
J'ai aussi fait un contrôle personnalisé pour mes commandes de l'utilisateur parce que j'ai besoin de transmettre certaines valeurs à partir de la page. Sur ce constructeur-je utiliser ViewState pour stocker ces valeurs.
La première fois que je charge le contrôle de l'utilisateur-je appeler son constructeur avec paramètres. Lorsque j'ajoute que le contrôle de l'utilisateur sur chaque publication-je utiliser son constructeur normal.
Mon problème est que je les valeurs que j'ai stockées sur le ViewState est devenue nulle successives de publication.
Mise à jour:
C'est un morceau de mon contrôle de l'utilisateur:
public class MyUserControl : System.Web.UI.UserControl
{
private int PKId
{
get { return ViewState["pkId"] as int; }
set { ViewState["pkId"] = value; }
}
public MyUserControl(int pkId)
{
this.PKId = pkId;
}
...
}
Je suis la suite de cet article à charge des contrôles dynamiquement: http://msdn.microsoft.com/en-us/magazine/cc748662.aspx#id0070065.
Deuxième Mise À Jour:
J'ai également réglé le même ID de contrôle, lorsque je charge le contrôle de l'utilisateur lors de la première utilisation et à chaque reaload.
Je peux peut-être utiliser une autre méthode pour stocker ces valeurs comme l'entrée des champs cachés ou de Cache. J'ai choisi de ViewState parce que je ne veux pas surcharger le serveur avec des valeurs de Session pour chaque utilisateur.
Troisième mise à jour:
I load the controls with this code:
System.Web.UI.UserControl baseControl = LoadControl(ucUrl) as System.Web.UI.UserControl;
if (baseControl != null)
{
baseControl.ID = "DestinationUserControl";
PanelDestination.Controls.Add(baseControl);
}
Et reaload avec ce code:
DynamicControls.CreateDestination ud = this.LoadControl(TrackedUserControl) as DynamicControls.CreateDestination;
if (ud != null)
{
ud.ID = "DestinationUserControl";
PanelDestination.Controls.Add(ud);
}
Ce qui se passe?
- Veuillez fournir une partie du code qui fait ce que nous puissions avoir une meilleure idée sur ce qui se passe.
- J'ai mis à jour la question.
- Pourquoi êtes-vous en tapant comme UserControl dans la charge initiale, et que CreateDestination dans le re-charger?
- Btw, une autre façon de faire serait d'enregistrer manuellement l'état du contrôle dans l'état d'affichage (vous pouvez le faire en remplaçant SaveViewState, ou par le transfert de la copie de l'état important dans le ViewState sur pré-rendu). Sur la publication, vous pouvez remplacer LoadViewState et mettre manuellement l'état enregistré dans des champs d'instance (ou de transférer de l'état de l'état d'affichage de votre créé dynamiquement de contrôle au début de la Charge).
- Je vais utiliser la Session à la place de l'état d'affichage. Il y a quelque chose releated à des contrôles utilisateur chargés dynamiquement que faire de lost ViewState variables.
Vous devez vous connecter pour publier un commentaire.
Essayez de stocker le contrôle dans une variable locale une fois qu'il est chargé/construit avant d'être ajouté à la hiérarchie de contrôle. Qui permet à l'état d'affichage de données pour être mappé à partir de et vers le contrôle. Voir "article 2" ici http://chiragrdarji.wordpress.com/2009/05/20/maintain-viewstate-for-dynamic-controls-across-the-postback/.
Quand êtes-vous de charger le contrôle de l'utilisateur? Ce qui doit arriver dans l'événement Init si vous voulez ViewState sauver/restaurer.
L'ajout de contrôles de façon dynamique à l'intérieur d'un UpdatePanel est une mauvaise idée. Il génère donc beaucoup de problèmes.
Si c'est possible, déplacez le contrôle dynamique de la création de l'UpdatePanel et je crois que votre problème sera résolu.
Comme Bryan mentionné, vous devez charger vos contrôles dynamiques dans Page_Init plutôt que Page_Load.
Comme cette description de la Page Cycle de Vie explique, par le temps de l'événement Page_Load se produit, l'état d'affichage de la publication a déjà été traité (Précontrainte). Si les contrôles n'ont pas été rechargé encore, l'état d'affichage n'a nulle part où aller.