Como obter o documento CDHtmlDialog após Asp.Net AJAX UpdatePanel

votos
1

Quando a página exibida em nossa CDHtmlDialog faz um Asp.Net AJAX UpdatePanel temos um evento de navegar, mas tudo depois que parece estar perdido. Não temos um documento mais ou obter quaisquer eventos do mouse na página.

Publicado 10/12/2008 em 00:25
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

Parece que eu fiz o post original como um usuário não registrado, então eu não acho que eu possa editá-lo. Fomos capazes de contornar o problema original, mas veio à tona novamente em um contexto diferente (realmente começando a odiar CDHTMLDialog).

Aqui é a causa do problema:
as chamadas Javascript estão causando um evento Navigate e CDHtmlDialog :: OnBeforeNavigate é chamado e desconecta e exclui o IHTMLDocument2. Infelizmente não é um verdadeiro Navegar desde que a página nunca mudou. Isto significa CDHtmlDialog :: OnNavigateComplete nunca é chamado para obter o documento de volta.

Para piorar a situação, quando eu substituir CDHtmlDialog :: OnBeforeNavigate Acho que a seqüência de URL é ilegível (bug)?

O (? Melhor) solução mais simples:
Precisamos interceptar o evento Antes Navegar, e só chamar _OnBeforeNavigate2 do CDHtmlDialog se o URL não é uma ação javascript:

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);
        }
    }
}

A maioria deles é bastante normal para a criação de uma subclasse CDHtmlDialog, e é muito simples realmente, mas ele me levou um pouco para descobrir como lidar com JavaScript. Infelizmente, eu não sei como isso vai funcionar se o JavaScript está fazendo alterações dinâmicas da própria página.

A Notas casal:

  • Se a navegação precisa ser completamente cancelada aqui, em seguida, defina * Cancelar = TRUE e não chamar _OnBeforeNavigate2. Tenha cuidado aqui, porque isso também cancela as ações JavaScript.
  • Não ficou claro até que eu vi a fonte , mas CDHtmlDialog :: _ OnBeforeNavigate2 apenas chama CDHtmlDialog :: OnBeforeNavigate.
Respondeu 02/02/2009 em 18:34
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more