2

我有一个包含在更新面板中的简单表单(文本框、提交按钮)。

<asp:UpdatePanel ID="ReplyUpdatePanel" UpdateMode="Conditional" runat="server">
    <ContentTemplate>
       <asp:Textbox id="ReplyTextBox" runat="server"/>
       <asp:Button id="SubmitButton" OnClick="SubmitButton_Click" runat="server"/>
    <ContentTemplate>
</asp:UpdatePanel>

所以,当我点击按钮时,服务器端点击事件被触发(SubmitButton_Click),数据库发生了一些事情,页面被重新渲染(异步)。

这是我的问题 - 在所有“数据库发生的事情”之后,我需要执行一些 JavaScript。

换句话说,我需要创建一些 JavaScript,其数据/参数基于服务器端逻辑。

我试过这个:

Page.RegisterStartupScript

和这个

ScriptManager.RegisterStartupScript

两者都不起作用(什么都没有发生)。

现在我可以.add_pageLoaded使用客户端 AJAX 库挂钩该函数(在部分更新完成后执行客户端脚本),但问题是我需要来自在按钮单击事件上创建的服务器的数据。

IE:

Sys.Application.add_init(function () {
                Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(function (sender, args) {
                    var panels = args.get_panelsUpdated();
                    for (var i = 0; i < panels.length; i++) {
                        // check panels[i].id and do something
                    }
                });
            });

目前我能想到的唯一“黑客”是执行上述操作,但调用 Web 服务,再次获取所有数据然后执行我的脚本。我说“hack”是因为我不需要进行异步回发,挂钩到 after-partial-postback 事件处理程序,然后再次调用服务器以获取先前发布的信息。

似乎是一个普遍的问题。不,我无法删除 UpdatePanel(即使我很愿意),也不想浪费时间争论原因。

任何非hacky的想法?

编辑

澄清我需要发送到脚本的数据:

我在文本框中输入一些文本,单击提交,然后服务器创建一个数据库记录并返回一个对象,该对象具有 ID、名称、URL、Blah 等属性。这些是脚本需要的值。

因此,如果我要从客户端代码调用 Web 服务,为了获取刚刚创建的值,我需要做一些技巧(获取最后修改的具有文本框值的记录)。不理想,一个表单帖子的两个 AJAX 调用也不理想。(更新面板回发,然后是 Web 服务调用)。

4

1 回答 1

2

而不是add_pageLoaded你想要add_endRequest的,像这样:

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function (sender, args) {
  //check here...
});

不同之处在于endRequest当任何部分回发回来时运行。

于 2010-08-26T00:08:29.207 回答