ASP.NET隐藏字段在回发后没有更新

4

我在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 代码,用于触发更新 updatepanel 的操作:

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

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

sendingRequest.Value = "0";

这个值在回发后没有被更新,而且我不知道为什么会这样!

有人能帮忙吗?谢谢


可能是重复的问题:ASP.NET在部分异步回发后获取隐藏字段的值... - Robert Levy
这不是重复的问题。之前的问题是在服务器端动态创建隐藏字段时无法获取其值。而我现在遇到的问题是,在UpdatePanel ContentTemplate容器中客户端创建隐藏字段时,其值没有更新。 - Jimmy
你确定在服务器上将它设置为0后,它没有被重新设置为1(或从视图状态中加载)吗? - Jaime
不是故意的...这个问题可能与同一页上有第二个UpdatePanel并且每5秒刷新一次有关吗?虽然隐藏字段在单独的UpdatePanel中,但我不明白为什么会影响隐藏字段的更新。 - Jimmy
你能否发布完整的.aspx页面和代码后端?即使没有其他,这将在我们审查您的代码时提供更好的上下文。也许我们可以为您找到更好的解决方案。 - Kyle Trauberman
其实并不是这样的..有很多代码,而且大部分都没有关联。但我找到了解决问题的方法——我有一个第二个UpdatePanel每5秒刷新一次,我通过防止它在sendingRequest设置为“1”时更新来解决了问题。(所以现在它不会更新,直到服务器将其设置回“0”为止)。它可以工作,但我真的不明白为什么,因为这个HiddenField不在每5秒刷新的UpdatePanel中!似乎第二个UpdatePanel正在覆盖sendingRequest的值,即使sendingRequest不在其中。 - Jimmy
4个回答

5

如果你遇到了隐藏字段的问题,你可以使用文本框代替。通过使用css(display: none;)来隐藏文本框,可以实现与隐藏字段类似的效果。虽然不是非常美观,但这是一个可行的解决方法。


我知道这是一个旧的帖子。我只是想分享我的解决方案。只需将该值添加到启用视图状态的任何控件的 YourCtrl.Attributes["yourattname"] 属性中,它也应该可以正常工作。 - c00000fd

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

但我遇到的问题并不是 JavaScript... 回发很好用。在回发期间更新值的过程没有正确执行。 - Jimmy
那么您的意思是我需要一个单独的JavaScript函数在客户端将sendingRequest值设置为“0”吗?但这是一个postback,所以我肯定可以在服务器端使用sendingRequest.Value =“0”来设置该值,因为我可以访问服务器上的sendingRequest控件。 - Jimmy
好的,你在服务器端将它设置为0,而在客户端看到了0。那么,这不是你想要的吗? - SoftwareGeek
不..最初它被设置为0,如我的XAML中所指定的。然后我在客户端将其设置为“1”,并进行回发。然后在服务器上,它是“1”(因为客户端已经设置了它),但是在我的updatepanel_Load结束时,我想将其设置回“0”。所以我在服务器上使用sendingRequest.Value =“0”;但是该值在客户端上没有被设置/更新-它仍然是“1”。 - Jimmy
我建议你尝试使用page.registerscript方法并查看发生了什么。网上有很多例子。但要注意,这种方法有不同的版本,所以要使用适合你情况的版本。 - SoftwareGeek
显示剩余2条评论

0

这个类似的场景在这里已经成功实现:

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

请确保您遵循相同的步骤 - 我无法看到您的所有代码。首先尝试使用标签,以确保它作为可见控件得到更新。如果这样可以工作,那么请使用隐藏值缩小范围,以确保对于隐藏控件行为没有不同。


嗨,我已经完全复制了那个网站上的代码,使用了一个HiddenField,它完美地运行了。但是当我尝试将其与我的实际页面集成时,它就不起作用了 - 值就是无法更新。我弄不明白为什么,也许是因为页面上有第二个UpdatePanel每5秒钟更新一次的缘故?但是我不明白为什么这会影响隐藏字段所在的UpdatePanel是否能成功更新.. :/ - Jimmy

0

我在编程中遇到了一个问题,即在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 后调用面板的 update 方法。我必须这样做,因为我的按钮是一个部分后台控件(UseSubmitBehaviour=False)。
    hfParams.Value = paramlist.ToString()
    hfForms.Value = formlist.ToString()
    hfStartJob.Value = "True"
    CType(mstr.FindControl("UpdatePanel1"), UpdatePanel).Update()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接