【问题标题】:asp.net hidden field not retaining value when updated from code behind从后面的代码更新时,asp.net 隐藏字段不保留值
【发布时间】:2011-02-14 14:35:46
【问题描述】:

我正在使用隐藏字段将值存储在 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(); 
}

【问题讨论】:

  • 当您在浏览器中查看回发后加载的页面源时,隐藏字段的值是否仍然为“真”?按照您上面所说的方式,您在第二次回发后看到“真实”,但不要说在您在页面上执行任何操作之前是否检查它实际上仍然是“真实”。
  • 嗨@patmortech 在源中,当页面最初加载和回发后,该值都是 false。在后面的代码中将该字段的值设置为“false”后,下次回帖时会看到“true”。
  • 您在使用 Firebug 吗?如果是这样,请在您的 SetHiddenVariable 函数中放置一个断点。检查它是否在你不期望的时候被调用。
  • 不使用 IE8 的 Firebug。我向 SetHiddenVariable 添加了一个 alert('blah') ,它仅在我期望它时被调用,即在使用 'onchange' 事件更改控件中的值之后。当 VS javascript 代码中有断点时,Firebug 会中断吗?
  • Firebug 不关心你的 javascript 来自哪里——你只需要在它的脚本选项卡中找到你的方法并设置一个断点。

标签: javascript asp.net hidden-field


【解决方案1】:

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

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

【讨论】:

  • 你是一个绅士和一个学者。我之前确实将它移到了更新面板中,但它无法识别隐藏字段,所以我放弃了这种方法。这次我把它放在 里面,它起作用了。
  • 2 年后,这仍然是对的!谢谢楼主
  • 一直在苦苦挣扎,但您的回答挽救了我的一天。
  • 这帮助我解决了一个稍微不同的问题,即在隐藏字段中保存值。谢谢。
  • 很高兴我在努力弄清楚之前发现了这个!
【解决方案2】:

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

将您的 HiddenField 更改为:

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

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

【讨论】:

  • 马克我以为你破解了它,但在改变你的建议并再次运行后它仍然是一样的:(
  • 所有输入都不使用 viewstate 作为 value 属性。它使用在 Request.Form 列表中发送的 http 值。在隐藏字段中禁用 ViewState 有点没用,因为唯一重要的属性是 Value,它甚至不使用 ViewState。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-29
相关资源
最近更新 更多