Le contrôle HiddenField, comme son nom l'indique, est un contrôle serveur qui masque les zones de saisie. Il permet de sauvegarder des données qui n'ont pas besoin d'être affichées sur la page et ne nécessitent pas une haute sécurité. Peut-être devrait-on se demander à ce stade : pourquoi avons-nous encore besoin d'utiliser HiddenField alors que nous disposons de mécanismes de sauvegarde d'état tels que ViewState, Session et Cookie ?
Le but de l'ajout de HiddenField est de rendre l'application de l'ensemble du mécanisme de gestion de l'état plus complète. Parce qu'il s'agit de ViewState, Cookie ou Session, il y aura un moment où il expirera. Par exemple, l'utilisateur devra définir ViewState sur false en raison de certains besoins, ou les conditions environnementales restreignent l'utilisation du Cookie, ou l'utilisateur a été inactif. pendant une longue période, provoquant l'expiration de la session, etc. À l'heure actuelle, HiddenField est sans aucun doute le meilleur choix.
La fonction du contrôle HiddenField est simplement de stocker les valeurs qui doivent être conservées entre l'envoi au serveur. Il est rendu sous la forme d'un élément <input type="hidden"/> et peut être transformé en un contrôle serveur HTML standard en ajoutant runat="server". Vous trouverez ci-dessous les propriétés et événements disponibles pour le contrôle de serveur Web ASP.NET HiddenField.
<asp:ChampHidden
EnableTheming="Vrai | Faux"
EnableViewState="Vrai | Faux"
ID="chaîne"
OnDataBinding="Gestionnaire d'événements DataBinding"
OnDisposed="Gestionnaire d'événements supprimé"
OnInit="Gestionnaire d'événement d'initialisation"
OnLoad="Charger le gestionnaire d'événements"
OnPreRender="Gestionnaire d'événements PreRender"
OnUnload="Décharger le gestionnaire d'événements"
OnValueChanged="Gestionnaire d'événements ValueChanged"
runat="serveur"
SkinID="chaîne"
Valeur="chaîne"
Visible="Vrai|Faux"
/>
Étant donné que la valeur de HiddenField sera rendue au navigateur client, elle ne convient pas au stockage de valeurs sensibles en matière de sécurité. Pour spécifier une valeur pour le contrôle HiddenField, utilisez la propriété Value. Notez qu'il s'agit de Value et non de Text. En fait, HiddenField n'a pas de propriété Text, ce qui est cohérent avec la dénomination des propriétés des boutons standard tels que DropDownList et CheckBoxList. Dans la méthode de dénomination de propriété standard, la valeur de Text est présentée à l'utilisateur, tandis que la valeur de Value est contrôlée via le code. Par exemple, vous pouvez demander à la propriété Text de DropDownList d'afficher le nom de l'utilisateur et à sa valeur de stocker le numéro de l'utilisateur.
Le code ci-dessous montre l'utilisation de base du contrôle.
<html>
<tête>
<langage de script="C#" runat="serveur">
void Button1_Click (expéditeur de l'objet, EventArgs e)
{
si (HiddenField1.Value == String.Empty)
HiddenField1.Value = "0" ;
HiddenField1.Value = (Convert.ToInt32(HiddenField1.Value)+1).ToString();
Étiquette1.Text = HiddenField1.Value ;
}
</script>
</tête>
<corps>
<h3><font face="Verdana">Champ caché</font></h3>
<formulaire runat=serveur>
<asp:HiddenField id=HiddenField1 runat=Serveur />
<asp:Button id=Button1 Text="Cliquez sur le bouton" onclick="Button1_Click" runat="server" />
Cliqué <asp:Label id=Label1 Text="0" runat=server /> fois
</form>
</corps>
</html>
Dans le code ci-dessus, <asp:HiddenField id=HiddenField1 runat=Server /> définit un contrôle masqué qui compte le nombre de clics de l'utilisateur dans l'événement de clic du bouton et attribue le nombre de modifications à Label1.
Vous pouvez modifier <asp:HiddenField id=HiddenField1 runat=Server /> dans le code ci-dessus en <input type=hidden id=HiddenField1 runat=Server>. Il est également possible
d'utiliser le code ci-dessus si vous affichez la source. navigateur Le code obtiendra les informations suivantes :
<form name="Form1" method="post" action="Default.aspx" id="Form1">
En effet, HiddenField transmet les données via le protocole HTTP. Ainsi, si vous ouvrez une nouvelle page de formulaire via "method="get" ou un lien, HiddenField n'est pas disponible.
De plus, HiddenField ne remplace pas Session pour conserver le statut. Dans l'exemple ci-dessus, même si vous cliquez une fois sur le bouton pour afficher le nombre de clics, cela ne signifie pas qu'il peut enregistrer vos informations de statut. Si vous rouvrez le navigateur, vous verrez toujours 0 ici au lieu de 3.
Événement HiddenField
Le HiddenField le plus couramment utilisé est l'événement ValueChanged, qui est déclenché lorsque la valeur change. Cependant, en utilisation réelle, vous devez connaître l'ordre d'enregistrement des pages. Pendant le processus de publication de la page, vous pouvez vérifier le cycle de page spécifique sur le site Web suivant
http://msdn2.microsoft.com/zh-cn/library/ms178472.aspx
L'exemple suivant illustre ce problème
<head>
<script runat="serveur" langage="c#">
protected void Page_Load (expéditeur de l'objet, EventArgs e)
{ Response.Write("<p>L'événement Page_Load de la page est déclenché et l'heure de déclenchement est : " + DateTime.Now.ToString());
si (HiddenField1.Value == String.Empty)
HiddenField1.Value = "0"; }
protected void Button1_Click(object sender, EventArgs e)
{ Response.Write("<p>Button1_Click est un événement déclenché avant de modifier la valeur de Hidden. L'heure de déclenchement est : " + DateTime.Now .ToString( ));
HiddenField1.Value = (Convert.ToInt32(HiddenField1.Value) + 1).ToString();
Label1.Text = HiddenField1.Value;
}
protected void HiddenField1_ValueChanged(object sender, EventArgs e)
{ Response.Write("<p>L'événement ValueChanged de HiddenField est déclenché et l'heure de déclenchement est : " + DateTime.Now.ToString()) ; }
</script>
</head>
<body>
<form id="form1" runat="server">
<div> <asp:HiddenField ID="HiddenField1" runat="server" OnValueChanged="HiddenField1_ValueChanged" />
</div> <asp :Label ID="Label1" runat="server" Text="Label"></asp:Label>
<br /> <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text=" Bouton" />
</form></body>
</html>
Dans cet exemple, le résultat souhaité est le suivant : lorsque l'utilisateur clique sur le bouton, la valeur de HiddenField1 est modifiée via l'événement Button1_Click du bouton, puis l'événement HiddenField1_ValueChanged de HiddenField1 est déclenché. Cependant, est-ce vraiment le cas ?
Exécutez le code ci-dessus et obtenez le résultat. Comme vous pouvez le voir, le Button change la valeur de HiddenField à chaque fois que vous cliquez dessus, mais la sortie que nous avons définie dans HiddenField1_ValueChanged n'est pas exécutée. Événement ValueChanged. Pour comprendre ce problème, vous devez également comprendre le cycle de déclaration de la page. Pendant le cycle de la page, vous pouvez voir que les propriétés du contrôle sont lues ou initialisées dans Page_Init, puis dans les événements de contrôle.
L'événement signifie ici : Dans l'événement Page_Init, la page Web acceptera les données renvoyées par l'utilisateur, par exemple, attribuera <span id="Label1">Label</span> à l'attribut Text avec l'ID Label1 et <input type La valeur de ="hidden" name="HiddenField1" id="HiddenField1" value="0" /> est affectée à la propriété Value de HiddenField1. Une fois toute l'initialisation terminée, la page commence à exécuter l'événement de contrôle - Button1_Click et modifie la valeur de HiddenField dans l'événement Button. Alors, puisque la valeur a été modifiée ici, pourquoi l'événement ValueChanged n'est-il pas exécuté ?
À l'heure actuelle, bien que la valeur Value ait été modifiée ici, elle est enregistrée dans Page_Init. En effet, lorsque vous cliquez sur le bouton Button, bien que HiddenField soit modifié, la réponse de la page est également déclenchée à nouveau, c'est-à-dire bien que la valeur Value ait été modifiée ici. précédent HiddenValue La valeur est 0, et cette fois sa valeur est changée en 1. Cependant, après la publication de la page, puisque ViewState enregistrera la dernière installation (ici 1), donc dans Page_Init, la valeur initiale de HiddenField est prise en compte être 1, et cette fois les temps sont toujours 1, ce qui donne l'impression que les données n'ont pas changé, donc l'événement ValueChanged ne sera toujours pas déclenché.
Bien sûr, vous pouvez désactiver HiddenField pour le traitement et vous pouvez exécuter ValueChanged. événement, mais en fait après avoir désactivé ViewState, la page n'enregistre plus la valeur de ViewState, donc la page pense que chaque demande de HiddenField est nouvelle, comme le code suivant :
Vous n'avez pas modifié la valeur Hiddenfield, mais elle s'exécute toujours à chaque fois.
<%@ Page EnableViewState="false" %>
<tête>
<script runat="server" language="c#">
protected void Page_Load (expéditeur d'objet, EventArgs e)
{
if (HiddenField1.Value == String.Empty)
HiddenField1.Value = "111"
}
protected void Button1_Click (expéditeur d'objet, EventArgs e)
{ // HiddenField1.Value = (Convert.ToInt32 (HiddenField1.Value) + 1).ToString ();
Label1.Text = TextBox1.Text; }
protected void HiddenField1_ValueChanged(objet expéditeur, EventArgs e)
{ Response.Write("Changed." + DateTime.Now.ToString());
Réponse.Write(HiddenField1.Value);
Réponse.Write(TextBox1.Text); }
</script>
</tête>
<body>
<form id="form1" runat="server"> <div>
<asp:HiddenField ID="HiddenField1" runat="server" OnValueChanged="HiddenField1_ValueChanged" />
</div>
<asp:Label ID= "Label1" runat="serveur" Text="Label"></asp:Label>
<br />
<asp:TextBox runat=server ID=TextBox1></asp:TextBox>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
</form>
</body >
</html>
L'utilisation de HiddenFile combinée à la page "Cross Page" fournie par ASP.NET2.0 peut réaliser le transfert des données de page. Cette situation est pour une telle solution :
Dans une page d'inscription, l'utilisateur doit saisir des données Comme il peut y avoir beaucoup de données dans la colonne des remarques, un contrôle similaire à FreeTextBox peut être utilisé dans une nouvelle fenêtre pour permettre à l'utilisateur de formater le texte, et après la saisie. est terminé, retournez à la page d’inscription originale. Concernant cette situation, nous la présenterons plus tard