如何确定在客户端更新了哪个更新面板
本文关键字:更新 客户端 何确定 | 更新日期: 2023-09-27 18:14:43
对于我的特殊问题,我需要在客户端找到UpdatePanel
已更新的方法。要在服务器端弄清楚这一点并不难(关于这一点有很多SO问题),但我更喜欢客户端更通用的解决方案。
我尝试了以下方法:
- 我检查了
PageRequestManager
客户端对象,没有成功 - 我检查了
$("#__EVENTTARGET").val()
的值,希望有任何ID可以使用(总是空的)
我的情况是,我已经写了一个脚本的控制是通过Sys.Application.add_init
执行,这就是为什么EVENTTARGET隐藏字段可能还没有被填充。
我的想法是混合ASP技术。MVC (IHttpModule)和Webforms(像这里)得到一个干净和通用的解决方案。
因此,我的计划是访问请求的参数,并将JS注入到为我声明事件目标的响应中。
我现在想知道的是:这是一个很好的解决方案,还是我不知道一些现有的功能来确定哪个更新面板被更新了?(或者这是一个丑陋的解决方案,你知道更好的方法)
我知道的一种方法是使用Sys.WebForms.PageRequestManager pageLoading Event
来获取回发后将要更新的更新面板的名称。
从MSDN:
在收到服务器对异步回发的响应之后,但在页面上的任何内容更新之前引发。
要获得更新面板列表,您需要调用get_panelsUpdating
函数:
<script>
Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(pageLoadingHandler);
function pageLoadingHandler(sender, args) {
console.log("Following panels are going to be updated:");
var panelsToBeUpdated = args.get_panelsUpdating();
for (var index in panelsToBeUpdated) {
console.log(panelsToBeUpdated[index].id);
}
}
</script>
或者,您可以在使用Sys.WebForms.PageRequestManager initializeRequest Event
将任何内容发送到服务器之前拦截异步回发。我认为这将是可能的更新面板列表保存到一些变量/字段/任何可用的脚本。
<script>
Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(initializeRequestHandler);
function initializeRequestHandler(sender, args) {
var panelsToBeUpdated = args.get_updatePanelsToUpdate(); // This function returns client ids of update panels
for (var index in panelsToBeUpdated) {
console.log(panelsToBeUpdated);
}
}
</script>
无论如何,几乎所有的页面事件处理程序sender
参数都有_postBackSettings
字段,可用于获取受回发影响的面板id列表:
sender._postBackSettings.panelsToUpdate
这个字段唯一的缺点是它的名称中有_
,这意味着它是"私有的";并应避免直接访问
在此期间,我修改了我的生产解决方案,但对于这个特定的问题,你确实可以实现IHttpModule并注入代码来更新javascript中的信息,以防有人遇到类似的情况。