从代码后面更新时,asp.net隐藏字段不保留值如何解决?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (11)

我正在使用一个隐藏的字段在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'时,如果我不更改网络表单上的任何值,它仍然是错误的。每当我改变另一个控件时,javascript函数被调用,并且隐藏的字段值被更新为'true'。这一切都很好。

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

hdnDirtyFlag.Value = "false";

但是当我点击另一个按钮并进行回发时,隐藏字段值仍然为'true'。

任何人都可以解释为什么这是?我在代码后面跳过代码,并在更改值后立即看到值为'false'。在页面上有一个asp:UpdatePanel,但隐藏的字段不是此面板的一部分。

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

if (hdnDirtyFlag.Value == "true")
{
    UpdateSecurityObject(); 
}
提问于
用户回答回答于

问题是隐藏字段在更新面板之外。尽管更新面板可以在回发期间访问页面上的所有控件(因为它的行为类似于普通回发),但它不会更新ContentTemplate之外的页面客户端上的任何控件。因此,在隐藏字段值的隐藏代码中,代码不会影响客户端的值。这就是为什么第二次点击按钮时它仍然设置为true。

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

用户回答回答于

ViewState是持久化的值,所以当页面重新加载ViewState时,它会有true,所以asp.net会在页面呈现之前用true更新控件的值。

将文本框更改为:

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

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

扫码关注云+社区