2011-02-14 110 views
16

我使用隱藏的字段來存儲在asp.net頁面中的值。基本上我設置隱藏字段的值每當窗體上的一個值被改變,即第一名稱,日期等領域是在具有一個主頁,並且在所述內容部分中的網頁表單:asp.net隱藏的字段不保留價值當從後面的代碼更新

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

我通過調用函數改變在JavaScript中字段的值每當onchange事件火災其他控件的網頁表單:

<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'時,如果我不更改網絡表單上的任何值,它仍然是錯誤的。每當我改變另一個控件時,JavaScript函數被調用,隱藏的字段值被更新爲'true'。這一切都很好。

我提交表單,並更新數據庫後,我在後面的代碼中設置隱藏字段的值返回爲「假」:

hdnDirtyFlag.Value = "false"; 

但是當我點擊另一個按鈕,做回傳,隱藏字段值仍然是'真'。

任何人都可以解釋爲什麼這是?我在代碼後面跳過代碼,並在更改值後立即看到值爲'false'。在頁面上有一個asp:UpdatePanel,但隱藏的字段不是此面板的一部分。

編輯:

這是我使用的代碼來檢查該字段的值暫列第二回傳後,它已在第一回發的最後一步被設置爲false的代碼。值保持爲真由於某種原因在第二回發,經過如上所示已被設定爲true在JavaScript在客戶端然後重新設置爲假在後面的代碼:

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

當您在瀏覽器中查看瀏覽器頁面的源代碼並在回發後加載時,隱藏字段的值是否仍爲「真」?上述措辭的方式,您在第二次回發後會看到「真實」,但不要說在頁面上執行任何操作之前是否檢查確實仍然是「真實」的。 – patmortech 2011-02-14 14:51:40

+0

嗨@patmortech在源代碼中,當頁面最初加載和回傳之後,這個值都是false。在代碼後面將該字段的值設置爲'false'後,我在下次回發時看到'true'。 – 2011-02-14 15:12:46

+0

你使用的是Firebug嗎?如果是這樣,請在您的SetHiddenVariable函數中放置一個斷點。當你不期望它時,檢查它是否被調用。 – patmortech 2011-02-14 15:23:16

回答

36

您的問題是您的隱藏字段在更新面板之外。儘管更新面板可以在回發期間訪問頁面上的所有控件(因爲它的行爲類似於普通回發),但它不會更新ContentTemplate外部的頁面客戶端上的任何控件。因此,在隱藏字段值的隱藏代碼中,您的代碼不會影響客戶端的值。這就是爲什麼第二次點擊按鈕時它仍然設置爲true。你需要或者a)在UpdatePanel中放置隱藏的字段(或者你可以把它放在自己的面板中,UpdateMode設置爲Always);或者b)在UpdatePanel調用完成後觸發的客戶端上會有一些JavaScript將值設置爲false。

5

ViewState是持續的值,所以當頁面重新加載ViewState的時候它已經是true了,所以asp.net在頁面渲染之前用true更新控件的值。

您的文本改成這樣:

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

這將防止asp.net從維護這一領域的跨回傳的值,因爲你的意圖是將它設置爲false,每次頁面加載。