Cómo obtener el documento CDHtmlDialog después de Asp.Net AJAX UpdatePanel

votos
1

Cuando la página que se muestra en nuestro CDHtmlDialog hace un Asp.Net AJAX UpdatePanel, obtenemos un evento de navegación, pero parece que todo lo demás se perdió. Ya no tenemos un documento ni obtenemos ningún evento de mouse en la página.

Publicado el 10/12/2008 a las 00:25
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
0

Parece que hice la publicación original como usuario no registrado, así que no creo que pueda editarla. Pudimos solucionar el problema original, pero surgió de nuevo en un contexto diferente (realmente empezando a odiar CDHTMLDialog).

Aquí está la causa del problema: las
llamadas Javascript están causando un evento Navigate, y CDHtmlDialog :: OnBeforeNavigate se llama y se desconecta, y borra el IHTMLDocument2. Desafortunadamente no es un verdadero Navigate ya que la página nunca cambió. Esto significa que nunca se llama a CDHtmlDialog :: OnNavigateComplete para recuperar el documento.

Para empeorar las cosas, cuando anulo CDHtmlDialog :: OnBeforeNavigate, ¿puedo encontrar que la cadena URL no se puede leer (error)?

La solución más simple (¿la mejor?):
Debemos interceptar el evento Before Navigate y solo llamar al _DBeforeNavigate2 de CDHtmlDialog si la URL no es una acción de 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);
        }
    }
}

La mayoría de esto es bastante estándar para configurar una subclase CDHtmlDialog, y es bastante simple en realidad, pero me llevó un poco averiguar cómo manejar JavaScript. Lamentablemente, no estoy seguro de cómo funcionará si el JavaScript realiza cambios dinámicos en la página.

Un par de notas:

  • Si la navegación debe cancelarse por completo aquí, establezca * Cancelar = VERDADERO y no llame a _OnBeforeNavigate2. Tenga cuidado aquí porque esto también cancela cualquier acción de JavaScript.
  • No estaba claro hasta que vi la fuente , pero CDHtmlDialog :: _ OnBeforeNavigate2 solo llama a CDHtmlDialog :: OnBeforeNavigate.
Respondida el 02/02/2009 a las 18:34
fuente por usuario

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