2012-01-05 17 views
7

Cuando comienzo una devolución de datos usando __doPostBack, se crea un archivo que vuelve al usuario para descargarlo en el HttpContext.Current.Response.Cómo puedo evitar que una devolución de datos actualice la página en el cliente

Debido a cambio la Response, la página, incluyendo sus valores de JavaScript no se modifica

Pero cuando no tengo el archivo de salida, se actualiza la página (a causa de la devolución de datos) y la modificación javascript en la página son perdió.

¿Cómo puedo 'detener' la devolución de datos para continuar y conservar mi página actual? No puedo usar una devolución de datos asíncrona porque necesito la devolución de datos para permitir que el usuario descargue el archivo.

EDIT: información más después de algunas preguntas en los comentarios:

  • Se solicita al archivo de una solicitud de servicio web. El servicio web necesita para ejecutar una consulta exhaustiva para determinar si se creará un archivo. I prefiero que esto solo suceda una vez.
  • El usuario puede arrastrar/soltar algunos filtros que se utilizarán en el archivo solicitud. Si no hay ningún archivo disponible, el usuario debería poder cambiar sus filtros, por lo que no debe modificarse la página.
+1

El primero que viene a la mente es (no probado): utilizar un botón oculto como [PostbackTrigger] (http://msdn.microsoft .com/en-us/library/system.web.ui.postbacktrigger.aspx) para su UpdatePanel. En su manejador de servidor donde ha creado el archivo (o no) hasta el momento, registre javascript que 'haga clic' en este botón si tiene un archivo. Maneje este evento y entregue el archivo. Si no hay ningún archivo, no registre el script. –

+0

Funcionará, pero mi problema es que el archivo se solicita desde un servicio web. No sé si tendré un archivo hasta que se complete la solicitud. Con su solución, el archivo se crearía dos veces. Es una pesada petición que puede tomar un tiempo, así que preferiría no hacerlo dos veces. –

+1

¿Por qué necesita crear el archivo para saber si existe? Eso suena bastante extraño. Agregaría un método a su servicio web que verifica esto sin crear. –

Respuesta

7

De las normas W3 y RFC 2616:

10.2.5 204 Sin contenido El servidor ha cumplido la petición, pero no tiene que devolver una entidad de cuerpo, y podría querer volver actualizan meta informacion. La respuesta PUEDE incluir metainformación nueva o actualizada en forma de encabezados de entidad, que de estar presentes DEBERÍA asociarse con la variante solicitada .
Si el cliente es un agente de usuario, NO DEBE cambiar su vista de documento de la que provocó el envío de la solicitud. Esta respuesta es destinada principalmente a permitir la entrada de acciones sin provocando un cambio en la vista del documento activo del usuario, aunque cualquier metainformación nueva o actualizada DEBERÍA aplicarse al documento actualmente en la vista activa del agente de usuario. La respuesta 204 NO DEBE incluir un cuerpo de mensaje, y por lo tanto siempre termina con la primera línea vacía después de los campos de encabezado.

Tenga en cuenta la línea en negrita aquí. No lo he probado yo mismo; sin embargo, establecer el estado de HTTP en 204 y devolver un documento vacío, en lugar de tratar de detener la devolución de datos por completo, sin duda vale la pena intentarlo.

Buena suerte, espero que esto ayude.

EDIT: este es el código que hace el truco:
System.Web.HttpContext.Current.Response.StatusCode = 204;

+0

Increíble ... funciona genial! Exactamente la respuesta a mi pregunta sin ningún tipo de soluciones –

+0

Códigos de estado HTTP para el rescate! ¡Bonito! –

Cuestiones relacionadas