2011-12-21 21 views
12

Estaba tratando de devolver a Json de mi acción y después de eso IE intentó descargarlo y me mostró el cuadro de diálogo para guardar. Lo probé en Firefox, y funciona bien.IE intenta descargar JSON en ASP. NET MVC 3

return Json(new { success = false, message = ex.Message }, "application/json"); 

¿Cuál es el motivo de ese comportamiento y cómo puedo solucionarlo?

Después de que en Javascript parte de que este intento

if (responseJSON.success == false) { 
         alert(responseJSON.message); 
         cancel(); 
        } 

Pero IE no muestra alerta de todos modos. Me trae guardar el diálogo.

Traté de cambiar "application/json" con "text/plain" y el cuadro de diálogo para guardar desapareció, pero todavía no puedo ver la alerta. ¿Qué me estoy perdiendo?

EDIT:

Aquí es mi complect Javascript, estoy usando Valums qquploader (ex Ajaxupload) para la carga de imágenes

var uploader = new qq.FileUploader({ 
       element: document.getElementById("image-upload"), 
       action: '/Home/ImageUpload', 
       allowedExtensions: ['jpg', 'png', 'gif'], 
       sizeLimlit: 2048,onComplete: function (id, fileName, responseJSON) { 
        if (responseJSON.success == false) { 
         alert(responseJSON.message); 
         cancel(); 
        } 
        else { 
         alert("success"); 
          //some code here 
         } 
        } 
        }); 

que había probado con alert("success"); en mi parte más y reenviados JSON como "text/plain" y después de eso vi la alerta. Pero en ese momento responseJSON.success != false para mí. ¿Tienes alguna sugerencia sobre eso?

+1

¿Cómo llamas tu acción? ¿Puede mostrarnos el javascript del lado del cliente? –

+0

¿Algún complemento de IE o ajustes de configuración local? Verifique sus tipos MIME registrados. – asawyer

+0

Revisar mi edición Ya escribí parte de Javascript. @John Gibb, creo que no importa cómo llame mi acción. –

Respuesta

17

He resuelto que con este truco

return Json(new { success = false, message = ex.Message }, "text/html"); 

Y ahora funciona. Pero, ¿alguien puede explicar por qué funciona con text/html, y no funcionó con application/json y text/plain? Primero está intentando descargar JSON y el segundo es devolver propiedades indefinidas para los campos JSON.

+0

Tuve exactamente el mismo problema y lo hice funcionar cambiando de "application/json" a "text/html". Escribí sobre mis hallazgos en una publicación de blog, tal vez eso puede darte más información: http://blog.degree.no/2012/09/jquery-json-ie8ie9-treats-response-as-downloadable-file/ – Andreas

+1

IE no tiene json incorporado en el navegador hasta IE8. Esto estaba causando tantos problemas. En las páginas web puede solucionar esto agregando json2.js. que está disponible en https://github.com/douglascrockford/JSON-js – amesh

2

Estaba usando este mismo cargador y tuve el mismo problema.

Tiene que ver con los encabezados de solicitud enviados. IE necesita la solicitud para tener un encabezado de aceptación que indique json.

xhr.setRequestHeader("Accept", "application/json, text/javascript, */*; q=0.01"); 

Si inserta esto después de esta línea:

xhr.setRequestHeader("Content-Type", "application/octet-stream"); 

en el archivo js (el mío se llama fileuploader.js) pues, ya no debe tener el problema, y ​​no es necesario indicar texto/html en tu declaración.

p.s. He comentado la línea de tipo de contenido, pero ya no estoy seguro de por qué. Si solo agrega esto, la línea de aceptación no funciona, intente también comentar el encabezado de tipo de contenido.

Editar:

Miré a mi archivo de nuevo, y parece que también hizo otro cambio.

En lugar de la línea:

xhr.send(file) 

puse en:

var formData = new FormData(); 
formData.append("image", file); 
xhr.send(formData); 

Esto viene después de la línea setrequesrheader anteriormente.

No estoy seguro de si este cambio funcionará para todos los usos, como la carga de varios archivos. Solo cargo una sola imagen para mi uso.

+0

He intentado de ambas formas al comentar y no haber comentado esa línea, pero el resultado es el mismo. IE sugiere mi para descargar ese JSON. –

+0

Parece que me perdí otro cambio que hice en esa misma función. Edité mi publicación. Lo siento por eso. –

+0

Unhopefully, no funciona para mí. –

8

Este problema se produce cuando se utiliza un complemento de carga que usa un iframe para realizar la carga con IE (probado en 9.0).

IE establece el encabezado Accept: text/html, , application/xhtml+xml, */* y entonces cuando responde con Content-type: application/json, asume que es el archivo (o al menos esa es la única explicación que pude encontrar en la web).

Por lo tanto, para eludir eso, debe configurar Content-type: text/html o Content-type: text/plain.

Recomendaría implementar esto usando ActionFilter; en lugar de cambiar manualmente el tipo de contenido, detectar IE y una POST multiparte y cambiar el tipo de contenido en consecuencia.

Cuestiones relacionadas