21

asp.net ページに値を格納するために隠しフィールドを使用しています。基本的に、フォームの値が変更されるたびに非表示フィールドの値を設定します。つまり、名前、日付などです。フィールドは、マスターページを持ち、コンテンツセクションにある Web フォームにあります。

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

Web フォームの他のコントロールで onchange イベントが発生するたびに関数を呼び出して、javascript のフィールドの値を変更します。

<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>

ここまでは順調ですね。ページが読み込まれると、隠しフィールドの値は「false」になり、Web フォームの値を変更しないと false のままになります。別のコントロールを変更するたびに、javascript 関数が呼び出され、隠しフィールドの値が「true」に更新されます。繰り返しますが、これはすべて問題ありません。

フォームを送信してデータベースを更新した後、コード ビハインドで非表示フィールドの値を「false」に戻します。

hdnDirtyFlag.Value = "false";

しかし、別のボタンをクリックしてポストバックを実行すると、隠しフィールドの値はまだ「true」のままです。

これがなぜなのか説明できる人はいますか?コード ビハインドを確認したところ、値を変更した直後に、値が「false」であることがわかりました。ページに asp:UpdatePanel がありますが、隠しフィールドはこのパネルの一部ではありません。

編集:

これは、最初のポストバックの最後のステップで false に設定された後、2 番目のポストバックでコード ビハインドのフィールドの値を確認するために使用するコードです。上記のように、クライアント側の JavaScript で値が true に設定され、コード ビハインドで false に戻された後、2 回目のポストバックでも何らかの理由で値が true のままです。

if (hdnDirtyFlag.Value == "true")
{
    UpdateSecurityObject(); 
}
4

2 に答える 2

45

あなたの問題は、隠しフィールドが更新パネルの外にあることです。更新パネルは、ポストバック中にページ上のすべてのコントロールにアクセスできますが (通常のポストバックのように機能するため)、ContentTemplate の外部にあるページ クライアント側のコントロールは更新しません。したがって、隠しフィールドの値を変更しているコードビハインドのコードは、クライアント側の値に影響を与えていません。そのため、ボタンを 2 回目にクリックしても、まだ true に設定されています。

a) UpdatePanel 内に隠しフィールドを配置する (または、UpdateMode を Always に設定して独自のパネルに配置する)。または b) 値を false に戻す UpdatePanel 呼び出しが完了すると起動する JavaScript がクライアント側にある。

于 2011-02-16T06:32:19.790 に答える
5

ViewStateは値を保持しているため、ページをリロードすると、ViewStateにtrueが含まれるため、asp.netは、ページがレンダリングされる前にコントロールの値をtrueに更新します。

HiddenFieldを次のように変更します。

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

これにより、ページが読み込まれるたびにfalseに設定することが意図されているため、asp.netがポストバック間でこのフィールドの値を維持するのを防ぎます。

于 2011-02-14T14:49:27.953 に答える