39 votes

IE + jQuery.Form + multipart + json response = ie tente de télécharger la réponse

Je suis en train d'essayer de soumettre un formulaire avec un file champ via jQuery.Forme de plugin, voici le code:

$('form').ajaxSubmit({
  url: "/path",
  dataType: "json",
  contentType: "multipart/form-data"
...

Le serveur renvoie alors json comme une réponse. Fonctionne très bien dans tous les navigateurs sauf IE, qui essaie de télécharger la réponse sous forme d'un fichier. Si je supprime le fichier de champ à partir de la forme, il fonctionne aussi très bien.

J'ai vu plusieurs solutions ici et dans Google et fondamentalement essayé presque tout ce qui est décrit, y compris l'établissement de enctype pour le formulaire via jQuery, mais il ne fonctionne pas.

Toute suggestion serait très bien accueilli.

21voto

Dmitry B. Points 529

Vous pouvez simplement renvoyer JSON depuis le contrôleur en tant que "text / html", puis l’analyser côté client à l’aide de JQuery.parseJSON ().

Manette:

     return this.Json(
            new
                {
                    prop1 = 5,
                    prop2 = 10
                }, 
            "text/html");
 

Côté client:

 jsonResponse = $.parseJSON(response);

if(jsonResponse.prop1==5) {
     ...
}
 

Cette solution a fonctionné pour moi.

10voto

snitko Points 3477

Je n'ai pas trouvé de solution immédiate à ce problème, mais j'ai finalement mis en œuvre la solution de contournement suivante: j'ai utilisé dataType: "text" dans mon ajax paramètres, puis retourné clair à partir d'un contrôleur, en séparant les valeurs par ; et d'analyse sur le côté client. De cette façon, IE et Forefox cessé d'essayer de télécharger une réponse.

Je n'ai pas trouvé d'autre moyen pour empêcher, a déclaré le comportement des autres, puis de revenir en clair. J'ai essayé de retour JSON sous forme de texte brut, puis l'analyse de $.parseJSON, mais il ne fonctionne pas en raison de certaines erreurs js.

6voto

Sannek8552 Points 21

Il suffit d'envoyer la réponse avec 'Content-Type', en- tête 'text / html' .

2voto

devilmark84 Points 11

Il suffit de définir Content-Type: text/html

Cela est dû au fait que IE8 ne reconnaît pas le type MIME application/... . Cela fonctionne pour moi.

J'espère que ça aide.

1voto

Vanya Points 11

si vous travaillez avec Zend, vous pouvez le faire

 $this->getResponse()->setHeader('Content-Type', 'text/html');
 

dans votre action de contrôleur. et côté client, en cas de jQuery, vous pouvez faire

 data = $.parseJSON(data);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X