如何在Asp.Net AJAX UpdatePanel之后获取文档CDHtmlDialog

时间:2008-12-09 23:25:48

标签: c++ ajax mfc

当我们的CDHtmlDialog中显示的页面执行Asp.Net AJAX UpdatePanel时,我们会得到一个导航事件,但之后的所有内容似乎都会丢失。我们不再有文档或在页面上获取任何鼠标事件。

1 个答案:

答案 0 :(得分:0)

看起来我将原帖作为未注册用户,所以我认为我不能编辑它。我们能够解决原始问题,但它又在不同的环境中出现(真的开始讨厌CDHTMLDialog)。

以下是问题的原因:
Javascript调用导致Navigate事件,并调用CDHtmlDialog :: OnBeforeNavigate并断开连接并删除IHTMLDocument2。不幸的是,由于页面从未改变,因此它不是真正的Navigate。这意味着永远不会调用CDHtmlDialog :: OnNavigateComplete来获取文档。

更糟糕的是,当我覆盖CDHtmlDialog :: OnBeforeNavigate时,我发现URL字符串不可读(bug)?

最简单(最好?)解决方案:
我们需要拦截Before Navigate事件,如果URL不是javascript动作,则只调用CDHtmlDialog的_OnBeforeNavigate2:

BEGIN_EVENTSINK_MAP(CMyHTMLDlg, CDHtmlDialog)
    ON_EVENT(CMyHTMLDlg, AFX_IDC_BROWSER, DISPID_BEFORENAVIGATE2, OnBeforeNavigate2, VTS_DISPATCH VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_PBOOL)
END_EVENTSINK_MAP()

void CMyHTMLDlg::OnBeforeNavigate2(LPDISPATCH pDisp, VARIANT* URL,VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData,VARIANT* Headers, BOOL* Cancel)
{

    ...

    if (URL != NULL)
    {
        // Check if navigation is to a folder..
        CString url = CString(*URL);

        if(url.Left(11) != _T("javascript:"))
        {
            _OnBeforeNavigate2(pDisp, URL, Flags, TargetFrameName, PostData, Headers, (BOOL*)Cancel);
            // If dynamic linking MFC then the above handler doesn't exist. Need to call OnBeforeNavigate direct. 
            // This is from a code site, and it compiles, but I've never tested it to see if it works.
            //CDHtmlDialog::OnBeforeNavigate(pDisp,(LPCSTR)URL);
        }
    }
}

这大部分都是设置CDHtmlDialog子类的标准,实际上它非常简单,但我花了一些时间来弄清楚如何处理JavaScript。不幸的是,如果JavaScript对页面本身进行动态更改,我不确定这是如何工作的。

有几个笔记:

  • 如果需要在此处完全取消导航,请设置* Cancel = TRUE并且不要调用_OnBeforeNavigate2。这里要小心,因为这也会取消任何JavaScript操作。
  • 直到我看到source时才清楚,但CDHtmlDialog :: _ OnBeforeNavigate2只调用CDHtmlDialog :: OnBeforeNavigate。