簡體   English   中英

在Asp.Net AJAX UpdatePanel之后如何獲取文檔CDHtmlDialog

[英]How to get the document CDHtmlDialog after Asp.Net AJAX UpdatePanel

當CDHtmlDialog中顯示的頁面執行Asp.Net AJAX UpdatePanel時,我們會得到一個導航事件,但是此后的所有內容似乎都丟失了。 我們沒有文檔了,或者頁面上沒有鼠標事件。

看起來我是以未注冊用戶的身份發布原始帖子的,所以我認為我無法對其進行編輯。 我們能夠解決原始問題,但又在不同的背景下再次出現(確實開始討厭CDHTMLDialog)。

這是問題的原因:
Javascript調用導致了Navigate事件,並且CDHtmlDialog :: OnBeforeNavigate被調用,並斷開連接並刪除IHTMLDocument2。 不幸的是,由於頁面從未更改,因此這不是真正的導航。 這意味着從不調用CDHtmlDialog :: OnNavigateComplete來取回文檔。

更糟糕的是,當我重寫CDHtmlDialog :: OnBeforeNavigate時,我發現URL字符串不可讀(錯誤)?

最簡單(最好?)的解決方案:
我們需要攔截“導航前”事件,並且僅在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操作。
  • 直到我看到源代碼 ,還不清楚,但是CDHtmlDialog :: _ OnBeforeNavigate2只是調用CDHtmlDialog :: OnBeforeNavigate。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM