2010-03-16 13 views
1

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 

Répondre

0

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 
0

lorsque les messages de dernière page il n'y a rien à relier la hdEventName variable au contrôle que vous avez précédemment créé. ce que vous faites revient à déclarer un entier au niveau de la classe et à le définir à 5 lorsque vous créez des contrôles enfants. il n'y a rien pour maintenir cette valeur dans cette variable à travers les publications.

si vous voulez obtenir une référence au contrôle que vous avez créé précédemment, vous auriez à utiliser

hdEventName = CType(Page.FindControl("hdEventName") , HiddenField) 

(je devine à ce sujet) ou demande si vous êtes seulement préoccupé par la valeur .

+0

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