【问题标题】:ASP.NET hidden field not updating after postback回发后 ASP.NET 隐藏字段未更新
【发布时间】:2011-09-16 20:14:00
【问题描述】:

我的 ASP 页面上有一些代码,如下所示:

<asp:UpdatePanel runat="server" id="updatepanel1" UpdateMode="Conditional" onload="updatepanel1_Load" ChildrenAsTriggers="false">
<ContentTemplate>
<asp:HiddenField id="sendingRequest" runat="server" Value="0" />
....
</ContentTemplate>
</asp:UpdatePanel>

我的页面上也有一些 javascript,用于触发更新面板的更新:

var sendingRequest = document.getElementById("<%=sendingRequest.ClientID%>");
sendingRequest.value = "1";
__doPostBack('<%= updatepanel1.ClientID %>', '');

到目前为止一切正常,但在我的 updatepanel1_Load 事件中,我尝试将值设置回“0”:

sendingRequest.Value = "0";

这个值在回发后永远不会在客户端更新并设置回 0,我不知道为什么!

有人可以帮忙吗?谢谢

【问题讨论】:

  • 它不是重复的.. 这是在服务器端代码中动态创建隐藏字段值时获取隐藏字段值的问题。这里我的问题是在 UpdatePanel ContentTemplate 容器中创建客户端时隐藏字段的值没有更新
  • 您确定在服务器上将其设置回 0 后没有被设置回 1(或从视图状态加载)?
  • 不是故意的.. 这个问题是否与同一页面上的第二个更新面板有关,该更新面板每 5 秒刷新一次?我不明白为什么它会影响隐藏字段的更新,因为隐藏字段位于单独的更新面板中
  • 有什么方法可以发布完整的 .aspx 页面和代码吗?如果不出意外,它将在审查您的代码时为我们提供更好的上下文。也许我们可以为您找到更好的解决方案。

标签: javascript .net asp.net postback


【解决方案1】:

我在 Code-Behind 中设置了三个 HiddenFields 时遇到了问题,但是从 JQuery 轮询时没有设置它们的值。

我的问题原来是我的母版页使用了 UpdatePanel,而在我的 ASP.Net Init 事件中,我打算使用条件渲染的 UpdatePanel。

Private Sub Page_Init(sender As Object, e As System.EventArgs) Handles Me.Init
    mstr = CType(Master, Site)

    'setup partial rendering so Log can update asynchronously
    scriptManager = CType(mstr.FindControl("ScriptManager1"), ScriptManager)
    scriptManager.EnablePartialRendering = True
    scriptManager.AsyncPostBackTimeout = 28800
    CType(mstr.FindControl("UpdatePanel1"), UpdatePanel).UpdateMode = UpdatePanelUpdateMode.Conditional
    CType(mstr.FindControl("UpdatePanel1"), UpdatePanel).ChildrenAsTriggers = False
End Sub

问题是我在设置 HiddenFields 后忘记在我的面板上调用更新。我必须这样做,因为我的按钮是部分回发控件 (UseSubmitBehaviour=False)

    hfParams.Value = paramlist.ToString()
    hfForms.Value = formlist.ToString()
    hfStartJob.Value = "True"
    CType(mstr.FindControl("UpdatePanel1"), UpdatePanel).Update()

【讨论】:

    【解决方案2】:

    如果您在使用隐藏字段时遇到问题,您可以改用 TextBox。使用 css (display: none;) 隐藏文本框以实现与隐藏字段类似的结果。它不是很漂亮,但它是一个可行的解决方法。

    【讨论】:

    • 我知道这是一个旧线程。我只想分享我的解决方案。只需将值添加到任何启用了视图状态的控件的 YourCtrl.Attributes["yourattname"] 属性,它应该也能正常工作。
    【解决方案3】:

    类似的场景在这里成功完成:

    http://encosia.com/easily-refresh-an-updatepanel-using-javascript/

    确保您遵循相同的步骤 - 我看不到您的所有代码。首先尝试使用标签以确保它被更新为可见控件。如果可行,则使用您的隐藏值缩小范围,以确保隐藏控件的行为没有不同。

    【讨论】:

    • 嗨,我已经用 HiddenField 准确地复制了该站点上的代码并且它运行良好,但是当我尝试将它与我的实际页面集成时,它不起作用 - 值刚刚赢了不更新。我不知道为什么,但可能与页面上有第二个 UpdatePanel 有关,它每 5 秒更新一次?但我不明白为什么这会影响带有隐藏字段的更新面板是否会成功更新..:/
    【解决方案4】:

    尝试从服务器端调用 registerstartupscript 或类似的东西。我不记得确切的方法名称,但它是页面对象的一部分。这将注册您想要在客户端回发后执行的任何 javascript。

    【讨论】:

    • 但这不是我遇到问题的javascript...回发工作正常。它在回发期间更新了无法正常工作的值
    • 是的,但这不能在服务器端完成,它必须在客户端。因此,在服务器代码执行后,它会向浏览器吐出 javascript,然后设置隐藏字段值。我希望这就是你要找的。​​span>
    • 所以你是说我需要一个单独的javascript函数来在客户端将sendingRequest值设置为“0”?但这是一个回发,所以我当然可以使用 sendRequest.Value = "0"; 设置值在服务器端?我可以访问服务器上的发送请求控件。
    • 我相信更新面板的工作方式基本上等同于抓取。因此,它从回传中获取完整的 html,并在客户端解析它以替换更新面板中的部分。如果没有加载正确的 JS 文件,这将不起作用。
    • 好的,您在服务器端将其设置为 0,而您在客户端看到的是 0。那么,这不是你想要的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    相关资源
    最近更新 更多