56 votes

IE demande d'ouvrir ou d'enregistrer le résultat json du serveur

Internet Explorer en mode de compatibilité reçoit les données du serveur dans une méthode de rappel ajax, et fait apparaître une boîte de dialogue si je veux enregistrer les données ou les ouvrir. Comment se débarrasser de cela ?

dit le client :

$.ajax({
        type:'POST',
        data: $("#UIdlgHolder > form").serialize(),
        url: $("#UIdlgHolder > form").attr("action"),
        success: function (data, textStatus, jqXHR) {
            {
                alert(data.message);
            }
}

réponses du serveur :

return new JsonResult { Data = new { result = false, message = "Yay!" } };

2 votes

Quel est le type de contenu de la déclaration ?

1 votes

Ce n'est pas spécifique à ASP.NET, ASP.NET MVC3, ou jQuery ; c'est donc un double de cette question .

0 votes

Voir ma réponse aquí

36voto

ItsJason Points 522

Même si ce n'est pas censé être la bonne méthode, le fait de définir le type de contenu sur text/html a permis à IE de traiter ce problème correctement :

return Json(result, "text/html");

Fonctionne dans toutes les versions que les outils F12 vous donnent dans IE9.

9 votes

Ce n'est pas la bonne méthode. Il n'y a pas de "supposition" à ce sujet.

2 votes

C'est la seule chose qui a fonctionné pour moi. Je n'avais aucun contrôle sur la requête ajax (contrôle d'une tierce partie) et IE9 voulait no travail. Ainsi, même si ce n'est pas la bonne méthode, elle fonctionne quand même (sans problème sur les autres navigateurs jusqu'à présent).

0 votes

C'est ennuyeux, mais correct. J'avais un formulaire pour lequel je capturais l'événement Submit() et lançais AJAX pour obtenir une réponse JSON, et IE essayait stupidement d'ouvrir/enregistrer la réponse JSON en arrière-plan ! Cela a permis de résoudre le problème, au prix de la perte du formatage JSON dans Firefox lors de la visualisation directe de l'URL.

32voto

Chris Points 1323

Si vous utilisez MVC, une façon de gérer cette situation est d'implémenter un contrôleur de base dans lequel vous contourner (cacher) la méthode Json(objet) comme suit :

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

Maintenant, vos contrôleurs peuvent tous hériter de ExtendedController et appeler simplement return Json(model); ...

  • sans modifier le type de contenu de la réponse pour les navigateurs qui jouent le jeu (pas <=IE9 !)
  • sans avoir à se rappeler d'utiliser Json(data, "text/plain") dans vos différentes méthodes d'action Ajax

Cela fonctionne avec les requêtes json qui, autrement, afficheraient le message "Open or Save" dans IE8 & IE9, comme celles effectuées par jQuery File Upload

0 votes

Merci Timothy, content que ça te plaise ! (Cela nous a épargné bien des soucis dans nos projets).

1 votes

Parfait, juste parfait !

0 votes

J'ai besoin de la même solution en api web, pouvez-vous m'aider ?

14voto

Cargowire Points 633

Il semble que cette question de l'OS puisse vous concerner :

Comment puis-je convaincre IE d'afficher simplement l'application json plutôt que de proposer de la télécharger ?

Si non :

Avez-vous essayé de définir le type de données attendu dans les options ajax ? par exemple, dataType : json

Avez-vous essayé d'autres types de contenu comme "application/json" ou "text/javascript" ?

0 votes

La solution nécessite que chaque utilisateur exécute un hack regex... pas utile pour les applications web de production.

2voto

Tomasz Mikuś Points 126

Avez-vous essayé d'envoyer votre requête ajax en utilisant la méthode POST ? Vous pouvez également essayer de définir le type de contenu à 'text/x-json' lorsque vous renvoyez le résultat du serveur.

0 votes

Dites-moi, sur quel IE (version 6,7,8,9, 10 test) il échoue sur cette requête.

2voto

Andreas Points 344

J'ai changé le content-type en "text/html" au lieu de "application/json" côté serveur avant de renvoyer la réponse. Je l'ai décrit dans un article de blog, où d'autres solutions ont également été ajoutées :

http://blog.degree.no/2012/09/jquery-json-ie8ie9-treats-response-as-downloadable-file/

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