隠しフィールドを使用して、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();
}
問題は、非表示フィールドが更新パネルの外側にあることです。更新パネルは、ポストバック中にページ上のすべてのコントロールにアクセスできますが(通常のポストバックのように動作するため)、ContentTemplateの外部にあるページのクライアント側のコントロールを更新しません。したがって、非表示フィールドの値を変更しているコードビハインドのコードは、クライアント側の値に影響しません。そのため、ボタンを2回クリックしても、trueに設定されたままです。
A)UpdatePanel内に非表示フィールドを配置する必要があります(または、UpdateModeをAlwaysに設定して独自のパネルに配置できます)。またはb)UpdatePanel呼び出しが完了して値をfalseに戻すときに起動するjavascriptをクライアント側に持っています。
ViewStateは値を保持しているため、ページがリロードされるとViewStateにtrueが含まれるため、asp.netはページがレンダリングされる前にコントロールの値をtrueに更新します。
HiddenFieldを次のように変更します。
<asp:HiddenField ID="hdnDirtyFlag" runat="server" Value='false' EnableViewState="false" />
これは、ページがロードされるたびにfalseに設定することを意図しているため、asp.netがポストバック全体でこのフィールドの値を維持することを防ぎます。