ASP.Net: les contrôles utilisateur ajoutés à un espace réservé de manière dynamique ne peuvent pas extraire de valeurs

StackOverflow https://stackoverflow.com/questions/102483

  •  01-07-2019
  •  | 
  •  

Question

J'ajoute de manière dynamique des contrôles utilisateur à un contrôle serveur PlaceHolder. Mon contrôle utilisateur consiste en des étiquettes et des contrôles de zone de texte.

Lorsque je soumets le formulaire et que je tente d'afficher le contenu des zones de texte (dans chaque contrôle utilisateur) sur le serveur, elles sont vides.

Lorsque la publication est terminée, les zones de texte contiennent les données que j'ai entrées avant la publication. Cela me dit que le texte dans les cases est conservé via ViewState. Je ne sais tout simplement pas pourquoi je ne les trouve pas lorsque je débogue.

Quelqu'un peut-il me dire pourquoi je ne verrais pas les données saisies par l'utilisateur sur le serveur?

Merci pour toute aide.

Était-ce utile?

La solution

Ceci est basé sur la séquence d'événements .NET v1, mais cela devrait vous donner une idée:

  • Initialiser (événement d'initialisation)
  • Commencer l'état de la vue de suivi (vérifie si postback)
    • État d'affichage de la charge (si postback)
    • Charger les données de postback (si postback)
  • Load (événement Load)
    • Générer des événements modifiés (si postback)
    • Générer des événements de publication (si publication)
  • PreRender (événement PreRender)
  • Enregistrer l'état d'affichage
  • Rendu
  • Décharger (événement Unload)
  • Éliminer

Comme vous pouvez le constater, le chargement des données ViewState dans les contrôles a lieu avant l'événement Load. Par conséquent, pour que vos contrôles ajoutés dynamiquement soient "conservés". ces valeurs, elles doivent être present pour que la page ASP.NET recharge les valeurs en premier lieu. Vous devrez recréer ces contrôles à l'étape Init, avant que l'état d'affichage du chargement ne se produise.

Autres conseils

J'ai découvert hier que vous pouvez réellement faire fonctionner votre application comme d'habitude en chargeant l'arbre de contrôle juste après le déclenchement de loadviewstateevent. Si vous remplacez l'événement loadviewstate, appelez mybase.loadviewstate, puis insérez votre propre code pour régénérer les contrôles juste après, les valeurs de ces contrôles seront disponibles lors du chargement de la page. Dans l'une de mes applications, j'utilise un champ viewstate pour contenir l'ID ou les informations du tableau pouvant être utilisées pour recréer ces contrôles.

Protected Overrides Sub LoadViewState(ByVal savedState As Object)
    MyBase.LoadViewState(savedState)
    If IsPostBack Then
        CreateMyControls()
    End If
End Sub

Je pense que vous devrez ajouter le contrôle UserControl à PlaceHolder pendant la phase Init du cycle de vie de la page, afin que le ViewState soit rempli avant la phase de chargement pour lire ces valeurs. Est-ce l'ordre dans lequel vous les chargez?

Assurez-vous de définir vos contrôles dynamiques au niveau de la classe et de les ajouter au conteneur ASP:

Private dynControl As ASP.MyNamespace_MyControl_ascx

Et lorsque vous instanciez le contrôle, appelez LoadControl pour que l'objet soit ajouté correctement:

dynControl = CType(LoadControl("~/MyNamespace/MyControl/MyControl.ascx"), ASP.MyNamespace_MyControl_ascx)

Vous devez créer vos contrôles dans le gestionnaire d'événements Page_PreInit. Le modèle de contrôle du serveur ASP.NET est délicat. vous devez parfaitement comprendre le cycle de vie des pages pour le faire correctement.

Comme d'autres l'ont déjà dit, toute forme de manipulation de contrôle doit être effectuée avant la création de viewstate.

Voici un bon lien sur le cycle de vie des pages pour vous aider:

http://msdn.microsoft.com/en-us/library /ms178472.aspx

Nous avons connu la même chose et l'avons traitée en utilisant des contrôles fantômes sur page_load qui ont exactement le même fichier .ID, puis la publication de retour récupère les événements et les données. Comme d'autres l'ont dit, l'ajout dynamique du contrôle après les étapes d'initialisation indique que l'état est déjà construit et que les contrôles ajoutés après ne sont pas stockés.

J'espère que cela aide un peu.

Je souhaite également ajouter que j'ai vu les contrôles utilisateur fonctionner comme vous le souhaiteriez en définissant simplement la propriété Control.ID au moment de l'exécution. Si vous ne définissez pas l'ID, les éléments peuvent être construits dans un ordre différent et fonctionner de façon étrange.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top