我有一个简单的表单(文本框,提交按钮),它包含在更新面板中。
<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),数据库发生了一些事情,并且页面被重新呈现(异步)。
这是我的问题 - 我需要在所有“事情发生在db”之后执行一些JavaScript。
换句话说,我需要创建一些JavaScript,其数据/参数基于服务器端逻辑。
我试过这个:
Page.RegisterStartupScript
和这个
ScriptManager.RegisterStartupScript
既没有工作(没有任何反应)。
现在我现在可以使用客户端AJAX库(在部分更新完成后执行客户端脚本)挂钩.add_pageLoaded
函数,但问题是我需要来自服务器的数据在按钮点击事件上创建。
即:
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(尽管我很乐意),不想浪费时间争论为什么。
任何非黑客的想法?
修改
澄清我需要发送到脚本的数据:
我在文本框中键入一些文本,单击“提交”,然后服务器创建数据库记录并返回一个对象,该对象具有ID,Name,URL,Blah等属性。这些是脚本所需的值。
因此,如果我要从客户端代码调用Web服务,为了获取刚创建的值,我需要做一些黑客攻击(获取具有文本框值的最后修改记录)。不理想,也不是两个AJAX调用一个表单的帖子。 (更新面板回发,然后是Web服务调用)。
答案 0 :(得分:2)
而不是add_pageLoaded
,您需要add_endRequest
,例如:
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function (sender, args) {
//check here...
});
不同之处在于endRequest
会在任何部分回发返回时运行。