【问题标题】:Update Javascript after Async Post Back in ASP.NET在 ASP.NET 中异步回发后更新 Javascript
【发布时间】:2011-02-04 16:41:20
【问题描述】:

我的网站上有以下代码:

    <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 都会运行。但是,即使我的子例程在单击按钮后更新了会话变量,我总是会收到相同的警报。换句话说,相同的 javascript 在回发之后运行,并且没有更新。我很肯定会话变量正在更改。有谁知道为什么会这样?感谢您的意见!

非常感谢!

【问题讨论】:

  • 您是否尝试在 myButton_btn.Click-Handler 中调用 UpdatePanel.Update()?因此,我将删除显式触发器并将面板的ChildrenAsTriggers 设置为false。

标签: javascript asp.net ajax postback


【解决方案1】:

在按钮处理程序中试试这个:

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);

【讨论】:

  • 效果很好。我的问题是我的警报只是一个模拟代码,我真的不知道如何修改你的代码来做到这一点。您能否解释一下它是如何工作的,或者至少指向在线参考?非常感谢!
  • @Sebastian:您希望通过单击按钮触发的实际 javascript 函数是什么?应该通过RegisterStartupScript注入的js只要是就可以。为了便于阅读,请使用变量。 JS 可以是一行,也可以是换行,这只是为了提高可读性。
  • 那么,我应该在哪里编写我的函数?因为您似乎将功能拆分得很奇怪,一侧是警报部分,另一侧是会话部分...
  • @Sebastian:我还没有拆分 js 函数。我使用 String.Format 函数来使用参数。这使它更具可读性且不易出错(在我看来)。因此{0} 的部分将被替换为Session("myVariable")
  • 我的问题是我正在运行 JQuerry,所以它告诉我输入字符串的格式不正确。你知道解决办法吗?
【解决方案2】:

我确信有更好的方法来做到这一点,但我处理更新面板中返回的 javascript 的技巧涉及注册一个函数,该函数在任何更新的 UpdatePanel 中查找新的 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>

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 2017-03-14
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多