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

时间:2014-07-25 13:40:07

标签: c# asp.net webforms

对于我的特定问题,我需要在客户端找到UpdatePanel已更新的方法。要想在ServerSide上解决这个问题并不是很困难(有很多关于此问题的SO问题),但我更喜欢为客户端提供更通用的解决方案。

我尝试了以下事项:

  • 我检查了PageRequestManager客户端对象但没有成功
  • 我检查了$("#__EVENTTARGET").val()的值,希望任何ID可以使用(始终为空)

我的情况是我已经为Sys.Application.add_init执行的控件编写了一个脚本,这就是为什么EVENTTARGET隐藏字段可能尚未填充的原因。

我的想法是混合ASP.MVC(IHttpModule)和Webforms(如here)的技术,以获得一个干净而通用的解决方案。

因此,我的计划是访问请求的params并将JS注入响应,为我声明eventtarget。

我现在想知道的是:这是一个很好的解决方案还是我不知道某些现有的功能来确定哪个更新面板已更新? (或者这是一个丑陋的解决方案,你知道更好的方法吗)

2 个答案:

答案 0 :(得分:1)

我知道在回发后获取更新面板名称的一种方法是使用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

该字段的唯一缺点是名称中_,这意味着它是“私有的”,应该避免直接访问。

答案 1 :(得分:0)

与此同时,我修改了我的生产解决方案但是对于这个特定的问题,您确实可以实现IHttpModule并注入代码以更新javascript中的信息,以防万一有人偶然发现类似的情况。