2011-03-22 27 views
38

Comencé probando mis aplicaciones jQuery con IE9. Parece que puedo tener algunos problemas aquí. Me di cuenta de que cuando devuelvo los datos JSON a los métodos de Javascript siempre obtengo este mensaje que dice: "¿Desea abrir o guardar este archivo?" y me proporciona 3 botones: Abrir, Guardar y Cancelar. Por supuesto, mi javascript está tomando medidas basadas en los valores establecidos en el objeto JSON, pero dado que IE9 no lo pasa al script, no puedo ejecutar la acción de seguimiento desde allí.IE9 JSON Data "¿Desea abrir o guardar este archivo?"

¿Alguien más enfrenta este problema? Aquí hay una instantánea. enter image description here

+3

¿Cuáles son los encabezados HTTP que se envían de vuelta con la respuesta JSON del servidor? – BigFatBaby

+0

¿Has probado la misma página en otro navegador como FF? ¿Has habilitado javascript en IE 9? – Xhalent

+0

Es casi seguro que está enviando el tipo de contenido MIME incorrecto, o está haciendo algo muy extraño como enviar una respuesta JSON a una etiqueta IFRAME. Una URL repro nos permitirá ver fácilmente. (Habilitar o deshabilitar JS no tendría ninguna importancia). – EricLaw

Respuesta

2

En realidad, usted tenía razón @EricLaw. Después de establecer el tipo de contenido en el resultado de Json, funcionó. he tenido que añadir las siguientes líneas:

result.ContentEncoding = System.Text.Encoding.UTF8; 
result.ContentType = "application/json; charset=UTF-8 
+4

Esto no funciona para mí en absoluto – Dan

+0

Ver mi respuesta a continuación, debería ayudar: http://stackoverflow.com/questions/5388893/ie9-json-data-do-you-want-to-open-or-save- this-file/15911008 # 15911008 – Chris

21

Si alguien está usando ASP.net MVC y tratar de solucionar este problema - que utilizaron los siguientes métodos en construido en el marco MVC. Simplemente actualice el tipo de contenido y la codificación en el JsonResult.

public ActionResult Index(int id) 
{ 
     // Fetch some data 
     var someData = GetSomeData(); 

     // Return and update content type and encoding 
     return Json(someData, "text/html", System.Text.Encoding.UTF8, 
         JsonRequestBehavior.AllowGet); 
} 

¡Esto me solucionó el problema!

+0

Veo que la clase 'Json' está en' System.Web.Helpers', pero aparece el mensaje '' Método, delegado o evento esperado '' y no se compilará. ¿Sabes por casualidad lo que me estoy perdiendo? – atconway

+1

Con este enfoque, el desarrollador debe recordar configurar el tipo de contenido como "texto/html" cada vez que devuelve JSON. ¿Qué pasa si se olvidan? ¡No es una buena solución! Además, devolver datos JSON y decirle al navegador que el contenido HTML es fundamentalmente incorrecto. – Mosh

6

Ayer también me enfrenté a este problema con WebAPI, que me devolvió una lista de URL (de archivos subidos de forma asíncrona).

Simplemente configure el tipo de contenido como "texto/html" en lugar de "application/json; charset = UTF-8" predeterminado de los servicios WebAPI. Obtuve una respuesta como una cadena JSON y luego usé $ .parseJSON para convertirlo en objeto JSON.

public async Task<HttpResponseMessage> Upload() 
{ 
    // ... 
    var response = Request.CreateResponse(HttpStatusCode.OK, files); 
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html"); 
    return response; 
} 

// result is an iframe's body content that received response. 
$.each($.parseJSON(result.html()), function (i, item) 
{ 
    console.log(item.Url); 
}); 
+0

Gracias por la respuesta con respecto a webapi. Tengo este problema exacto y configurar el ContentType funcionó. Intenté configurar "text/html" a través de la sobrecarga CreateResponse, pero MVC lanza una excepción que indica que no puede encontrar un formateador para eso (solo admite json y xml). –

+0

También estoy enfrentando el mismo problema, probé esta solución pero está generando un error de conversión: no se puede convertir implícitamente el tipo 'System.Net.Http.HttpResponseMessage' a 'System.Threading.Tasks.Task Vipul

+0

@Vipul: Creo que hubo algún problema con su método de Tarea, ¿podría copiar su código aquí? –

3

En mi caso cuando contentType en cabecera de la respuesta es "application/json; charset = UTF-8", el IE 9 muestra que Prompt. Pero cambió a "text/html" y luego no aparece el mensaje, aunque todos los buscadores de nutrias están bien con "application/json; charset = UTF-8".

+0

En realidad IE8 también está roto y necesita el cambio. – philw

13

(respuesta originalmente publicada por this question.)

Si se utiliza MVC, una manera de manejar esto es implementar un controlador de base en la que se reemplaza el método (ocultar) JSON (objeto) de la siguiente manera:

public class ExtendedController : Controller 
{ 
    protected new JsonResult Json(object data) 
    { 
     if (!Request.AcceptTypes.Contains("application/json")) 
      return base.Json(data, "text/plain"); 
     else 
      return base.Json(data); 
    } 
} 

Ahora, los controladores pueden heredar toda ExtendedController y simplemente llamar return Json(model); ...

  • sin modificar el tipo de contenido de la respuesta para los navegadores que juegan muy bien (no < = IE9!)
  • sin tener que recordar a utilizar Json(data, "text/plain") en sus diversos métodos de acción Ajax

Esto funciona con las peticiones JSON que de otra forma mostrar el mensaje "Abrir o Guardar" en IE8 & IE9 como los realizados por jQuery File Upload

+1

Utilicé "text/html" en lugar de "text/plain", pero eso podría deberse a la implementación específica que utilicé en el cliente. Solo lo menciono para alguien que tiene el mismo problema. –

Cuestiones relacionadas