如何确定在客户端更新了哪个更新面板

本文关键字:更新 客户端 何确定 | 更新日期: 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中的信息,以防有人遇到类似的情况。