web-dev-qa-db-ja.com

コードビハインドから更新されたときにasp.netの隠しフィールドが値を保持しない

隠しフィールドを使用して、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」になり、Webformの値を変更しない場合はfalseのままになります。別のコントロールを変更するたびに、javascript関数が呼び出され、非表示フィールドの値が「true」に更新されます。繰り返しますが、これで十分です。

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

hdnDirtyFlag.Value = "false";

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

誰がこれがなぜなのか説明できますか?コードビハインドをステップ実行し、値を変更した直後に、値が「false」であることがわかります。ページにasp:UpdatePanelがありますが、非表示フィールドはこのパネルの一部ではありません。

編集:

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

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

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

A)UpdatePanel内に非表示フィールドを配置する必要があります(または、UpdateModeをAlwaysに設定して独自のパネルに配置できます)。またはb)UpdatePanel呼び出しが完了して値をfalseに戻すときに起動するjavascriptをクライアント側に持っています。

39
patmortech

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

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

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

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

4
Mark At Ramp51