web-dev-qa-db-fra.com

IE invite à ouvrir ou enregistrer le résultat JSON du serveur

Internet Explorer en mode de compatibilité récupère les données du serveur dans une méthode de rappel ajax et ouvre une boîte de dialogue si je souhaite enregistrer les données ou les ouvrir. Comment se débarrasser de ça? 

le client dit: 

$.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!" } };
54
iLemming

On dirait que cette question SO peut vous intéresser:

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

Si non:

Avez-vous essayé de définir le type de données attendu dans les options ajax? i.e. dataType: 'json'

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

14
Cargowire

Même si ce n'est pas censé être le bon moyen, définir le type de contenu sur text/html a permis à IE de gérer cela correctement pour moi:

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

Fonctionne dans toutes les versions fournies par les outils F12 dans IE9.

36
ItsJason

Si vous utilisez MVC, une solution consiste à implémenter un contrôleur de base dans lequel vous override (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);
    }
}

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

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

Cela fonctionne avec les requêtes json qui afficheraient sinon le message "Ouvrir ou Enregistrer" dans IE8 et IE9, telles que celles de jQuery File Upload

31
Chris

Avez-vous essayé d'envoyer votre demande ajax en utilisant la méthode POST? Vous pouvez également essayer de définir le type de contenu sur 'text/x-json' tout en renvoyant le résultat du serveur.

2
Tomasz Mikuś

Malheureusement, il ne s’agit là que d’une excuse supplémentaire pour utiliser Internet Explorer.

 enter image description here

La solution simple consiste à exécuter un petit fichier .reg sur votre PC, pour indiquer à IE d'ouvrir automatiquement les fichiers .json, plutôt que de demander si vous voulez l'ouvrir/le sauvegarder.

J'ai mis une copie du fichier dont vous aurez besoin ici:

Type de mime JSON

Vous aurez besoin de droits d'administrateur pour exécuter ceci.

2
Mike Gledhill

J'ai changé le type de contenu en "text/html" au lieu de "application/json" côté serveur avant de renvoyer la réponse. Décrit cela 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/

2
Andreas

Le code javascript ci-dessus est-il celui que vous utilisez dans votre application Web? Si tel est le cas, je voudrais y signaler quelques erreurs: fonction de rappel deuxièmement - il n’a pas de signe ')' après la définition du rappel ajax . Le code valide devrait ressembler à ceci:

$.ajax({
        type:'POST',
        data: 'args',
        url: '@Url.Action("PostBack")',
        success: function (data, textStatus, jqXHR) {
                alert(data.message);
            }
    });

essayez d'utiliser le code ci-dessus - il m'a donné l'alerte 'Yay' sur toutes les 3 versions IE (7,8,9).

1
Tomasz Mikuś

J'ai fait face à cela en utilisant plugin jQuery FileUpload .

Ensuite, j’ai jeté un coup d’œil dans leur documentation, plus précisément dans la section Négociation de type de contenu et ai suivi leur suggestion de Ruby/Rails.

render(json: <some-data>, content_type: request.format)

Ce qui a résolu le problème pour moi.

Explication rapide: pour les anciennes versions d'IE/Opera, ce plugin utilisera un iframe avec text/plain ou text/html type-contenu. Ainsi, si vous forcez la réponse à json, le navigateur tentera de le télécharger. L'utilisation du même type de contenu que dans la demande le fera fonctionner pour n'importe quel navigateur.

0
Rael Gugelmin Cunha

Dans mon cas, IE11 semble se comporter de la sorte quand il y a une erreur de syntaxe JS dans la console (peu importe où exactement) et que dataType: 'json' n'a aucun effet.

0
Artur Beljajev