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é.
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
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!
(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);
...
Json(data, "text/plain")
dans vos différentes méthodes d'action AjaxCela fonctionne avec les requêtes json qui afficheraient autrement le message "Ouvrir ou Enregistrer" dans IE8 & IE9 comme celles faites par jQuery File Upload
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);
});
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".