Javascript asp.net隐藏字段从代码隐藏更新时不保留值

Javascript asp.net隐藏字段从代码隐藏更新时不保留值,javascript,asp.net,hidden-field,Javascript,Asp.net,Hidden Field,我正在使用隐藏字段在asp.net页面中存储值。基本上,每当表单上的值发生更改时,即名字、日期等,我都会设置隐藏字段的值。该字段位于具有母版页且位于内容部分的Web表单上: <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> <asp:HiddenField ID="hdnDirtyFlag" runat="server" Value='false' /> 但

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

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <asp:HiddenField ID="hdnDirtyFlag" runat="server" Value='false' />
但是,当我单击另一个按钮并进行回发时,隐藏字段值仍然为“true”

有人能解释为什么会这样吗?我一步一步地浏览了后面的代码,在更改了值之后,我可以立即看到值为“false”。页面上有一个asp:UpdatePanel,但隐藏字段不在此面板中

编辑:

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

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

ViewState保留该值,因此当页面重新加载时,ViewState中包含true,因此asp.net会在页面呈现之前使用true更新控件的值

将HiddenField更改为:

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


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

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


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

当在回发后加载页面时,在浏览器中查看该页面的源时,隐藏字段的值是否仍然为“true”?按照上面的说法,您在第二次回发后看到的是“true”,但在对页面执行任何操作之前,不要说您是否检查它是否仍然是“true”。Hi@patmortech在源代码中,当页面最初加载时和回发后,该值都是false。在代码隐藏中将字段的值设置为“false”后,下次发回时我会看到“true”。你在使用Firebug吗?如果是这样,请在SetHiddenVariable函数中设置断点。检查它是否在你不期望的时候被调用。不要使用IE8的Firebug。我在SetHiddenVariable中添加了一个警报('blah'),并且它只有在我期望它时才会被调用,即在使用'onchange'事件更改控件中的值之后。当VS javascript代码中存在断点时,Firebug会崩溃吗?Firebug不在乎javascript来自何处——你只需要在其“脚本”选项卡中找到方法并设置断点。Mark我以为你破解了它,但在更改为建议并再次运行后,它仍然是一样的:(所有输入都不使用viewstate作为value属性。它使用在Request.Form列表中发送的http值。在hidden字段中禁用viewstate是没有用的,因为唯一重要的属性是值,它甚至不使用viewstate。你是一位绅士和学者。我以前在更新面板中移动过它,但它没有“我无法识别隐藏字段,所以我放弃了这种方法。这次我把它放在了中,它成功了。2年后,这仍然是正确的钱!!谢谢你,先生,你的回答救了我一天。这帮我解决了一个稍微不同的问题,即在隐藏字段中保存值。谢谢你。很高兴我在挣扎之前发现了这个问题。”我想弄明白!
if (hdnDirtyFlag.Value == "true")
{
    UpdateSecurityObject(); 
}
<asp:HiddenField ID="hdnDirtyFlag" runat="server" Value='false' EnableViewState="false" />