21

我正在使用隐藏字段将值存储在 asp.net 页面中。基本上,每当表单上的值发生更改时,我都会设置隐藏字段的值,即名字、日期等。该字段位于具有母版页且位于内容部分的网络表单上:

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

到现在为止还挺好。当页面加载隐藏字段值是“假”,如果我不更改网络表单上的任何值,它仍然是假的。每当我更改另一个控件时,都会调用 javascript 函数并将隐藏字段值更新为“true”。这一切都很好。

提交表单并更新数据库后,我在后面的代码中将隐藏字段值设置回“false”:

hdnDirtyFlag.Value = "false";

但是当我单击另一个按钮并进行回发时,隐藏字段值仍为“真”。

谁能解释这是为什么?我单步执行了后面的代码,在更改值后立即可以看到该值为“假”。页面上有一个 asp:UpdatePanel,但隐藏字段不是该面板的一部分。

编辑:

这是我在第一次回发的最后一步中将其设置为 false 之后,在第二次回发中检查代码后面字段的值的代码。由于某种原因,该值在第二次回发中保持为 true,在客户端的 javascript 中将其设置为 true,然后在后面的代码中将其设置回 false,如上所示:

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

2 回答 2

45

您的问题是您的隐藏字段位于更新面板之外。即使更新面板在回发期间可以访问页面上的所有控件(因为它的作用类似于正常的回发),但它不会更新 ContentTemplate 之外的页面客户端上的任何控件。因此,您在代码隐藏中更改隐藏字段值的代码不会对客户端的值产生影响。这就是为什么您第二次单击该按钮时它仍设置为 true 的原因。

您将需要 a) 将隐藏字段放在 UpdatePanel 中(或者您可以将其放在其自己的面板中,并将 UpdateMode 设置为 Always);或 b) 在客户端有一些 javascript 在 UpdatePanel 调用完成时触发,将值设置回 false。

于 2011-02-16T06:32:19.790 回答
5

ViewState 正在持久化该值,因此当页面重新加载时,ViewState 中包含 true,因此 asp.net 在页面呈现之前将控件的值更新为 true。

将您的 HiddenField 更改为:

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

这将阻止 asp.net 跨回发维护此字段的值,因为您的意图是在每次页面加载时将其设置为 false。

于 2011-02-14T14:49:27.953 回答