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.
InformationsquelleAutor VansFannel | 2010-02-12