我有一个包含在更新面板中的简单表单(文本框、提交按钮)。
<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 服务调用)。