J'ai un contrôle personnalisé qui hérite de la classe CompositeControl de .NET. Ce contrôle remplace les CreateChildControls afin de générer dynamiquement ses contrôles enfants. J'ai besoin de la page pour poster après quelques événements javascript différents se produisent sur le côté client. Pour ce faire, je crée deux contrôles cachés sur la page afin que je puisse définir leurs valeurs avec javascript, soumettre la page, et lire les valeurs sur le côté serveur. Voici le code que je l'utilise pour créer ces deux hiddens:Impossible d'obtenir les valeurs de la propriété Value de HtmlInputHidden
Protected Overrides Sub CreateChildControls()
hdEventName = New HiddenField()
Controls.Add(hdEventName)
hdEventName.ID = "hdEventName"
hdEventArgs = New HiddenField()
Controls.Add(hdEventArgs)
hdEventArgs.ID = "hdEventValue"
' other controls
' ...
End Sub
Lorsqu'un événement javascript se produit que je mets l'attribut de valeur des deux hiddens et soumettre la page, comme ceci:
hdEventName.value = 'EventName';
hdEventArgs.value = 'arg1,arg2';
document.forms[0].submit();
Dans le Méthode OnLoad de mon contrôle, je tente de vérifier la propriété Value des contrôles hdEventName et hdEventArgs, mais il est toujours vide. Cependant, Page.Request.Form (hdEventName.UniqueID) et Page.Request.Form (hdEventArgs.UniqueID) renvoient les valeurs correctes. Le code HTML actuel dans le balisage affiche également les valeurs correctes après la publication de la page.
Pourquoi la propriété Value de HtmlInputHiddens est-elle déconnectée de la valeur réelle affichée sur le client?
Mise à jour Il semble que les propriétés d'un contrôle soient chargées depuis le formulaire quelque temps après le chargement d'OnLoad. Ainsi j'ai pu résoudre mon problème en déplaçant le code qui vérifie les deux champs cachés dans la méthode OnPreRender, ou en ajoutant la méthode suivante à mon code -
Private Sub Event_Handler(ByVal sender As Object, ByVal e As EventArgs)
Handles hdEventName.ValueChanged
' do stuff with hiddens
' ...
' reset the values back
hdEventName.Value = String.Empty
hdEventArgs.Value = String.Empty
End Sub
Merci pour votre réponse. Oui, je comprends que déclarer les contrôles en tant que champs ne les stocke pas réellement à travers les publications. Mais aucun contrôle n'est stocké entre les publications. Chaque contrôle .NET est créé, chargé et rendu chaque fois que la page est postée, et donc la seule chose réelle qui est unique à la page et persiste tout au long de la publication est le ViewState. J'ai essayé votre solution juste au cas où, mais malheureusement, il a donné les mêmes résultats. – Sergei