【问题标题】:Callback after __doPostBack()?__doPostBack() 之后的回调?
【发布时间】:2011-11-28 18:20:32
【问题描述】:

我正在通过调用这样的方法来使用 Javscript 刷新 UpdatePanel:

reloadDropDown = function (newValue)
{
  __doPostBack("DropDown1", "");
  selectNewValueInDropDown(newValue);
}

在我的 UpdatePanel 中有一个 <select> 框,我需要选择一个带有 newValue<option>。我的问题是我的selectNewValueInDropDown 方法在__doPostBack 完成之前被调用。在调用我的 selectNewValueInDropDown 方法之前,我有什么方法可以“等待”回发?

【问题讨论】:

    标签: asp.net updatepanel postback webforms


    【解决方案1】:
    Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequestHandler);
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
    function BeginRequestHandler(sender, args)
    {
        //
    }
    function EndRequestHandler(sender, args)
    {
        //request is done
    }
    

    【讨论】:

    • 但是我的参数会在哪里发挥作用?我还需要一个入口点方法。
    • 您必须熟练使用 JavaScript 并设置一些状态变量才能知道何时触发您的方法。当你劫持框架/进程时,它就在你身上。
    • @BrianDavidBerman:你可以编写一个函数,调用selectNewValueInDropDown(newValue),然后调用Sys.WebForms...remove_endRequest(theFunction),将自己作为事件处理程序移除。
    • 知道为什么 MS 选择不在 __doPostBack 中包含回调参数吗?有技术原因吗?还是只是疏忽?
    【解决方案2】:

    为了让我的评论更具体,这里的想法是:

    reloadDropDown = function (newValue)
    {
        var requestManager = Sys.WebForms.PageRequestManager.getInstance();
    
        function EndRequestHandler(sender, args) {
            // Here's where you get to run your code!
            selectNewValueInDropDown(newValue);
    
            requestManager.remove_endRequest(EndRequestHandler);
        }
        requestManager.add_endRequest(EndRequestHandler);
    
        __doPostBack("DropDown1", "");
    }
    

    当然,您可能希望处理两个请求重叠的竞争条件。为了处理这个问题,您需要跟踪哪个处理程序针对哪个请求。您可以在服务器端使用 ScriptManager.RegisterDataItem 之类的东西,或致电 args.get_panelsUpdated() 并检查您感兴趣的面板是否已更新。

    【讨论】:

      猜你喜欢
      • 2014-02-20
      • 1970-01-01
      • 2011-12-18
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-02
      • 1970-01-01
      相关资源
      最近更新 更多