在ASP.NET中异步回发后更新Javascript

4

我在我的网站上有以下代码:

    <asp:ScriptManager ID="ScriptManager1" runat="server" />
    <asp:UpdatePanel runat="server" id="UpdatePanel" updatemode="Conditional">
    <Triggers>
        <asp:AsyncPostBackTrigger controlid="myButton_btn" eventname="Click" />
    </Triggers>
        <ContentTemplate>
            <script>
                function pageLoad(){
                    window.alert("<%=Session("myVariable")%>"); 
                    }
                }
            </script>

        </ContentTemplate>
    </asp:UpdatePanel>

    <asp:Button ID="myButton_btn" Text="Prev Month" runat="server"></asp:Button>

每次我点击按钮时,JavaScript 都会运行。然而,尽管我的子程序在单击按钮后更新了会话变量,但我始终收到相同的警报。换句话说,在 postback 后仍然运行相同的 JavaScript,并且没有更新。我肯定会话变量已经被更改。有人知道为什么会发生这种情况吗?感谢您的帮助!谢谢!

你尝试在myButton_btn.Click-Handler中调用UpdatePanel.Update()了吗?因此,我会移除显式触发器并将面板的ChildrenAsTriggers设置为false。 - Tim Schmelter
2个回答

5
在按钮处理程序中尝试以下内容:
VB.Net
ScriptManager.RegisterStartupScript(Me.UpdatePanel, GetType(string), "alertScript", String.Format("alert('{0}');",Session("myVariable")), true)

C#

ScriptManager.RegisterStartupScript(this.UpdatePanel, typeof(string), "alertScript", string.Format("alert('{0}');", Session["myVariable"]), true);

那个完美地奏效了。我的问题是,我的警告只是一段模拟代码,我不知道如何修改你的代码来实现它。你能否请解释一下它的工作原理,或者至少指向一个在线参考?非常感谢! - Sebolains
@Sebastian:你要从按钮点击触发的实际JavaScript函数是什么?通过RegisterStartupScript注入的js可以尽可能长。 为了可读性,可以使用变量。 JS可以一行或多行,这只影响可读性。 - Tim Schmelter
@Sebastian:我没有拆分js函数。我使用了String.Format函数来使用参数。这使得代码更易读,也更少出错(在我看来)。因此,{0}部分将会被替换为Session("myVariable") - Tim Schmelter
@Sebastian:你在哪一行代码中实际上遇到了“输入字符串格式不正确”的异常?jQuery只是JavaScript,所以对于“RegisterStartupScript”没有影响。请编辑您的问题并添加您目前拥有的代码,以便我们可以查看出了什么问题。 - Tim Schmelter
很高兴能够帮助。考虑接受答案,否则人们会认为它仍然是开放的。 - Tim Schmelter
显示剩余3条评论

0

我相信有更好的方法来处理这个问题,但我的解决方案涉及注册一个函数来查找更新的任何UpdatePanels中的新JavaScript,然后eval()它们的内容。以下是一个简单的示例:

Site.Master:

<script type="text/javascript">
    PageLoadedHandler = function(sender, args) {
        var panels = args.get_panelsUpdated();
        for (var i = 0; i < panels.length; i++) {
            var scripts = panels[i].getElementsByTagName('script');
            for (var j = 0; j < scripts.length; j++) {
                eval(scripts[j].innerHTML);
            }
        }
    }

    Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(PageLoadedHandler);
</script>

如果有更好的解决方案,我绝对愿意接受。


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