2011-12-21 21 views
12

Stavo cercando di restituire Json dalla mia azione e successivamente ho provato a scaricarlo e mi ha mostrato la finestra di dialogo di salvataggio. L'ho provato su Firefox, e lì funziona perfettamente.IE tenta di scaricare JSON in ASP. NET MVC 3

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

Qual è la ragione di questo comportamento e come posso risolvere il problema?

Dopo che in Javascript parte provo questo

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

Ma IE non mostra avviso in ogni caso. Mi porta a salvare la finestra di dialogo.

Ho provato a cambiare "application/json" con "text/plain" e il dialogo di salvataggio è scomparso, ma non riesco ancora a visualizzare l'avviso. Cosa mi manca?

EDIT:

Ecco il mio Complect JavaScript, sto usando Valums qquploader (ex-Ajaxupload) per il caricamento delle immagini

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 
         } 
        } 
        }); 

avevo provati con alert("success"); nella mia parte il resto e inoltrate JSON come "text/plain" e dopo ho visto l'avviso. Ma a quel tempo responseJSON.success != false per me. Hai qualche suggerimento a riguardo?

+1

Come stai chiamando la tua azione? Puoi mostrarci il lato client javascript? –

+0

Eventuali add-on IE o modifiche alle impostazioni locali? Controlla i tuoi tipi MIME registrati. – asawyer

+0

Controlla la mia modifica Ho già scritto parte di Javascript. @ John Gibb, penso che non sia importante come chiamo la mia azione. –

risposta

17

ho risolto che con questo trucco

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

E ora funziona. Ma qualcuno può spiegare perché funziona con text/html, e non ha funzionato con application/json e text/plain. Per prima cosa sta cercando di scaricare JSON e la seconda sta restituendo le proprietà non definite per i campi JSON.

+0

Ho avuto lo stesso identico problema e l'ho fatto cambiando da "application/json" a "text/html". Ho scritto le mie scoperte in un post sul blog, forse posso darti qualche informazione in più: http://blog.degree.no/2012/09/jquery-json-ie8ie9-treats-response-as-downloadable-file/ – Andreas

+1

IE non ha json integrato nel browser fino a IE8. Questo stava causando tanti problemi. Nelle pagine Web puoi risolvere questo problema aggiungendo json2.js. che è disponibile da https://github.com/douglascrockford/JSON-js – amesh

2

Stavo usando lo stesso uploader e ho avuto lo stesso problema.

Ha a che fare con le intestazioni di richiesta inviate. IE ha bisogno della richiesta di avere un'intestazione di accettazione che indichi json.

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

Se si inserisce questo dopo questa linea:

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

nel file js (la mia si chiama fileuploader.js) allora si dovrebbe più avere il problema, e non hanno bisogno di indicare text/html nel tuo ritorno.

p.s. Ho commentato la riga del tipo di contenuto, ma non sono più sicuro del perché. Se solo aggiungendo questo la riga di accettazione non funziona, prova a commentare anche l'intestazione content-type.

Edit:

ho guardato il mio file di nuovo, e sembra che anche fatto un altro cambiamento.

Al posto della linea:

xhr.send(file) 

ho messo in:

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

Questo avviene dopo la linea setrequesrheader sopra.

Non sono sicuro che questa modifica funzioni per tutti gli usi, come il caricamento di più file. Carico solo una singola immagine per il mio uso.

+0

Ho provato entrambi i modi con commenti e non commentando quella linea, ma il risultato è lo stesso. IE suggerisce mi per scaricare quel JSON. –

+0

Sembra che abbia perso un'altra modifica che ho apportato nella stessa funzione. Ho modificato il mio post. Mi dispiace per quello –

+0

Constatatamente, non funziona per me. –

8

Questo problema si verifica quando si utilizza un plug-in di caricamento che utilizza uno iframe per eseguire il caricamento con IE (testato su 9.0).

IE imposta l'intestazione Accept: text/html, , application/xhtml+xml, */* e così quando si risponde con Content-type: application/json, si presuppone che sia il file (o almeno questa è l'unica spiegazione che ho potuto trovare sul web).

Pertanto, per aggirare il problema, è necessario impostare Content-type: text/html o Content-type: text/plain.

Si consiglia di implementarlo utilizzando ActionFilter; invece di modificare manualmente il tipo di contenuto, rilevare IE e un POST multipart e modificare di conseguenza il tipo di contenuto.

Problemi correlati