web-dev-qa-db-fra.com

IE9 JSON Data "voulez-vous ouvrir ou enregistrer ce fichier"

J'ai commencé à tester mes applications jQuery avec IE9. On dirait que je peux avoir des ennuis ici. 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 fournit 3 boutons: Ouvrir, Enregistrer et Annuler. Bien sûr, mon javascript prend 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 face à ce problème? Voici un instantané.enter image description here

38
Anup Marwadi

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
2
Anup Marwadi

Si quelqu'un utilise ASP.net MVC et essaie de résoudre ce problème - j'ai utilisé les méthodes intégrées suivantes dans MVC framework. Mettez simplement à jour le type de contenu et l'encodage sur le 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ésolu le problème pour moi!

21
Deano

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

Si vous utilisez MVC, une façon de gérer cela est d'implémenter un contrôleur de base dans lequel vous remplacez (masquez) 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 réponse pour les navigateurs qui jouent bien (pas <= IE9!)
  • sans avoir à penser à utiliser Json(data, "text/plain") dans vos différentes méthodes d'action Ajax

Cela fonctionne avec les requêtes json qui afficheraient autrement le message "Ouvrir ou Enregistrer" dans IE8 & IE9 comme celles faites par jQuery File Upload

13
Chris

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

Définissez simplement le type de contenu sur "text/html" au lieu de "application/json; charset = UTF-8" par défaut des services WebAPI. J'ai obtenu une réponse sous forme de chaîne JSON, puis j'ai utilisé $ .parseJSON pour le 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);
});
6
Tien Do

Dans mon cas, lorsque contentType dans l'en-tête de réponse est "application/json; charset = UTF-8", le IE 9 affiche cette invite. Mais changé en "text/html", puis l'invite ne fonctionne pas montrer, bien que tous les navigateurs de loutre soient bien avec le "application/json; charset = UTF-8".

3
Rich