38 votes

Données JSON d'IE9 "voulez-vous ouvrir ou sauvegarder ce fichier".

J'ai commencé à tester mes applications jQuery avec IE9. Il semble que j'aie des problèmes. J'ai remarqué que lorsque je renvoie des données JSON aux méthodes Javascript, j'obtiens toujours cette invite qui dit : "Voulez-vous ouvrir ou enregistrer ce fichier ?" et me propose 3 boutons : Ouvrir, Enregistrer et Annuler. Bien sûr, mon javascript effectue des actions basées sur les valeurs définies dans l'objet JSON mais comme IE9 ne le transmet pas au script, je ne peux pas exécuter l'action de suivi à partir de là.

Quelqu'un d'autre est-il confronté à ce problème ? Voici un instantané. enter image description here

21voto

Deano Points 872

Si quelqu'un utilise ASP.net MVC et j'ai essayé de résoudre ce problème - j'ai utilisé les méthodes intégrées suivantes dans l'application Cadre MVC . Il suffit de mettre à jour le type de contenu et l'encodage sur le site web de l'entreprise. 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);
}

Cela a réglé le problème pour moi !

13voto

Chris Points 1323

(Réponse initialement postée pour cette question .)

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

6voto

Tien Do Points 1262

J'ai également rencontré ce problème hier avec une WebAPI qui renvoyait une liste d'URL (de fichiers téléchargés de manière asynchrone).

Il suffit de définir le type de contenu à "text/html" au lieu du type par défaut "application/json ; charset=UTF-8" des services WebAPI. J'ai obtenu la réponse sous forme de chaîne JSON et j'ai ensuite utilisé $.parseJSON pour la convertir en objet 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);
});

3voto

Rich Points 21

Dans mon cas, lorsque le contentType de l'en-tête de réponse est "application/json ; charset=UTF-8", IE 9 affiche cette invite. Mais s'il est remplacé par "text/html", l'invite ne s'affiche pas, alors que tous les navigateurs Otter fonctionnent bien avec "application/json ; charset=UTF-8".

2voto

Anup Marwadi Points 770

En fait, vous aviez raison @EricLaw. Après avoir défini le type de contenu dans le résultat Json, cela a fonctionné. J'ai dû ajouter les lignes suivantes :

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

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