2010-10-01 17 views
13

En nuestra (bastante grande y antigua) aplicación ASP.NET usamos muchas páginas cargadas en marcos, iframes y diálogos modales (usando window.showModalDialog). Estamos empezando a ver el error anterior un poco, y parece que no puedo encontrar una sola explicación racional para él en ninguna parte.JS: "El destinatario (servidor [aplicación no servidor]) no está disponible y desapareció". accediendo a window.opener

  1. Popup Blockers. Nop. No los estamos ejecutando. Ni siquiera el bloqueador incorporado.

  2. Zona de confianza. Nop. La aplicación se ejecuta en LocalHost ahora mismo, y está en la lista de sitios de confianza.

  3. Stray Cosmic Rays. Posible, pero no probable. Es demasiado consistente.

me hicieron , finalmente, encontrar el mensaje de error enterrados en el sitio de Microsoft en some dusty tome sobre cómo recuperar información de los mensajes de error de automatización. En ella, que estaban hablando de Excel, y dijeron: "En este ejemplo, Microsoft Excel es la aplicación de servidor referencia a un objeto de libro una vez que se destruye (o cerrado) genera el error."

Es decir probablemente lo más cerca que he llegado a una explicación de la causa del error, sin una explicación real y concreta. Alguien intentó usar algo después de que se deshizo de su referencia. Curiosamente, todavía puede ver las ventanas en la pantalla. Curiosamente, sin embargo, esto me suena sospechoso a la respuesta aceptada al this.

Así que esto es lo que sucede.

  • La página A es la página principal.
  • La página A muestra la página B en un marco. PageB es una barra de herramientas.
  • La página A muestra el PageC en otro marco. Ese es el contenido.
  • PageC muestra PageD en un cuadro de diálogo no modal.
  • PageD, por razones que desconozco, quiere modificar los controles en la página B. Está intentando usar window.opener para hacer eso y fallar horriblemente.

Si alguien me puede aclarar por qué es así (el código funciona en FF), se lo agradecería.

+0

¿Qué versión de IE y qué sistema operativo? Si se trata de IE7, es probable que el problema sea el Modo protegido. Si se trata de IE8, es probable que esté relacionado con LCIE. ¿Puedes reproducir el problema si comienzas a ejecutar IE como administrador? – EricLaw

+0

IE8 con una aplicación alojada en IIS7. Puedo intentar ejecutar IE como administrador, pero todavía estamos usando VS2008 SP1, y la experiencia de depuración en Win7 es bastante ... poco convincente. –

+0

Hola Mike, cualquier idea sobre lo que está pasando ... Experimento el mismo problema – krul

Respuesta

5

Debería haber actualizado esta pregunta antes, y me disculpo por la demora. Aprendí un poco desde que lo publiqué, y esto es lo que aprendí.

Para ventanas abiertas con window.showModalDialog, el método window.opener devuelve nulo, en lugar de una referencia a la ventana de apertura. Para obtener una referencia a la ventana de apertura, debe pasarla como un argumento de diálogo.

No me queda claro en este momento si este es el comportamiento previsto; aparentemente es comportamiento no documentado. Además, según MSDN, window.opener solo es válido para páginas cargadas en marcos e iframes.

2

Tuve exactamente el mismo mensaje de error en la siguiente situación: ventana A ventanas emergentes viento B, búsqueda de usuario algo y viento B llamadas viento A pasando un parámetro. Método invocado sobre el viento A Supongamos cerrar el viento emergente B después de que termine de hacer lo que está haciendo. Estaba pasando el parámetro como objeto: p = {a: 1, b: "c"} después de volver a escribir el código para pasar cada parámetro por separado el error desapareció. callingMethod (1, "c");

la esperanza de que ayude a alguien ...

+0

Wow. Gracias, gracias, gracias. Estaba bastante perplejo antes de leer tu respuesta. – morgancodes

11

Aunque mi respuesta no es directamente aplicable a esta pregunta en particular, si usted está recibiendo este error (El destinatario (servidor [no aplicación de servidor]) no está disponible y desapareció;) cuando se comunica entre una ventana emergente y la ventana de apertura, es porque la ventana emergente creó un objeto que luego pasó a la ventana de apertura. Cuando se cierra la ventana emergente, Internet Explorer elimina todos los objetos creados por la ventana emergente. Y dado que el objeto se pasa por referencia, el objeto al que hace referencia la ventana de apertura ya no existe. Una solución fácil es pasar el valor convirtiendo el objeto en una cadena JSON utilizando JSON.stringify. A continuación, puede convertir la cadena de nuevo a un objeto en window.opener utilizando JSON.parse().

Ejemplo:

Ventana emergente:

window.opener.callback(JSON.stringify({ 
    id: 1, 
    name: "foo" 
})); 

elevalunas:

window.callback = function (response) { 
    var foo = JSON.parse(response); 
}; 

Con este enfoque, la ventana de apertura ya no se hace referencia al objeto que se creó en el ventana emergente, por lo que el objeto en la ventana de apertura sobrevivirá después de que se cierre la ventana emergente.

0

usted puede conseguir este error en Excel

Sub LoadParameterForm() 

If frmParm Is Nothing Then 
    Set frmParm = New frm_setParameters 
End If 

frmParm.Show 
end sub 

Aquí frmParm es una variable de nivel de módulo. Al hacer clic en el botón Aceptar, intento .HIDE() el formulario para que las opciones del usuario sean correctas. Si el usuario hace clic en la casilla de control X y cierra el formulario, entonces esencialmente tiene frmParm apuntando a algo que ya no existe.

No he encontrado una forma de probar la condición, atrapo el error, establezco el formulario en cero e intento de nuevo.

Me doy cuenta de que esta no es exactamente la pregunta que se hace, pero es un ejemplo concreto del problema de Excel relacionado mencionado varias veces en las publicaciones.

Cuestiones relacionadas