web-dev-qa-db-fra.com

champ caché asp.net ne conservant pas de valeur lors de la mise à jour du code derrière

J'utilise un champ caché pour stocker une valeur dans une page asp.net. Fondamentalement, je définit la valeur du champ masqué chaque fois qu'une valeur du formulaire est modifiée, c'est-à-dire le prénom, la date, etc. Le champ est sur un formulaire Web qui a une page maître et se trouve dans la section de contenu:

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <asp:HiddenField ID="hdnDirtyFlag" runat="server" Value='false' />

Je change la valeur du champ en javascript en appelant une fonction chaque fois qu'un événement onchange se déclenche dans d'autres contrôles du formulaire Web:

<asp:TextBox CssClass="niceInput" ID="tbFirstName" runat="server" MaxLength="40" Width="150" onchange='SetHiddenVariable();'></asp:TextBox>

 <script type="text/javascript">
     function SetHiddenVariable() {
         // Set the value of the hidden variable so we know a field has been updated
         var hiddenControl = '<%= hdnDirtyFlag.ClientID %>';
         document.getElementById(hiddenControl).value = 'true';
     }
</script>

Jusqu'ici tout va bien. Lorsque la page se charge, la valeur du champ masqué est "false" et si je ne modifie aucune valeur sur le formulaire Web, elle reste fausse. Chaque fois que je change un autre contrôle, la fonction javascript est appelée et la valeur du champ caché est mise à jour sur "true". Encore une fois, tout va bien.

Après avoir soumis le formulaire et mis à jour la base de données, j'ai redéfini la valeur du champ masqué sur 'false' dans le code derrière:

hdnDirtyFlag.Value = "false";

Mais lorsque je clique sur un autre bouton et que je fais une publication, la valeur du champ masqué est toujours à "true".

Quelqu'un peut-il expliquer pourquoi c'est? J'ai parcouru le code derrière et immédiatement après avoir changé la valeur, je peux voir que la valeur est "fausse". Il y a un asp: UpdatePanel sur la page mais le champ caché ne fait pas partie de ce panneau.

ÉDITER:

C'est le code que j'utilise pour vérifier la valeur du champ dans le code derrière dans le deuxième postback, après qu'il a été défini sur false dans la dernière étape du premier postback. La valeur reste à true pour une raison quelconque dans le deuxième postback, après avoir été définie sur true en javascript côté client, puis redéfinie sur false dans le code derrière, comme indiqué ci-dessus:

if (hdnDirtyFlag.Value == "true")
{
    UpdateSecurityObject(); 
}
20
Ciaran Bruen

Votre problème est que votre champ masqué est en dehors du panneau de mise à jour. Même si un panneau de mise à jour a accès à tous les contrôles d'une page pendant la publication (puisqu'il agit comme une publication normale), il ne met à jour aucun contrôle de la page côté client qui se trouve en dehors du ContentTemplate. Ainsi, votre code dans le codebehind qui modifie la valeur du champ caché n'a pas d'effet sur la valeur côté client. C'est pourquoi la deuxième fois que vous cliquez sur le bouton, il est toujours défini sur true.

Vous devrez soit a) placer le champ caché dans UpdatePanel (ou vous pouvez le placer dans son propre panneau avec UpdateMode défini sur Always); ou b) avoir du javascript côté client qui se déclenche lorsque l'appel UpdatePanel se termine, ce qui redéfinit la valeur sur false.

39
patmortech

ViewState conserve la valeur, donc lorsque la page se recharge, ViewState contient true, donc asp.net met à jour la valeur du contrôle avec true avant le rendu de la page.

Changez votre HiddenField en ceci:

<asp:HiddenField ID="hdnDirtyFlag" runat="server" Value='false' EnableViewState="false" />

Cela empêchera asp.net de conserver la valeur de ce champ sur les publications, car votre intention est de le définir sur false à chaque chargement de la page.

4
Mark At Ramp51