2010-10-08 3 views
1

J'utilise le plugin de formulaire jQuery (comme suggéré dans un certain nombre de threads comme this one) pour faire un post Ajax à un contrôleur .NET MVC et consommer le JSON que je reçois arrière. Cela fonctionne très bien dans Chrome, mais dans certains autres navigateurs, y compris Firefox 3, les résultats de soumission de formulaire dans une boîte de dialogue "Enregistrer ou ouvrir ce fichier". Le JavaScript ressemble:Problème avec la réponse JSON d'ASP.NET MVC dans certains navigateurs

var options = { 
      dataType: "json", 
      clearForm: true, 
      beforeSubmit: hideUpdateField, 
      success: handleNewsPostSuccess 
     }; 

     $('div#Updates form').ajaxForm(options); 

et de la viande de la réponse du contrôleur est:

Object response = new { html = RenderPartialViewToString("DisplayNewsPost", np), newpoints = points.ToString() }; 
return Json(response, "application/json; charset=utf-8"); 

Qu'est-ce que je manque? C'est comme si l'événement submit ne se rattachait pas à Firefox et aux autres navigateurs à problème. J'ai essayé de faire ma propre action de soumission en utilisant ajaxSubmit à la place avec un retour faux dedans, mais aucune différence.

Répondre

2

Utilisez différents types MIME pour la réponse; text/plain devrait fonctionner. Je crois que FF est confus par le type inconnu MIME application/* et suppose donc que c'est certaines données spécifiques à l'application qui sont mieux téléchargés en tant que fichier séparé. Vous pouvez également tester l'en-tête Content-Disposition en le définissant sur inline. Firefox devrait y obéir, mais IIRC il pourrait y avoir quelques problèmes avec IE.

+1

Je considérerais cela comme un bug dans l'implémentation de FireFox, mais vous travaillez avec ce que vous avez, pas ce que vous voulez. –

0

La méthode JSON déjà le type de contenu approprié afin que vous n'avez pas besoin de le répéter: Je pense que la forme est en fait pas

return Json(response); 

Mais du comportement que vous décrivez (dialogue Enregistrer sous) posté en utilisant AJAX mais un POST normal. Cela peut être dû au fait que le DOM n'était pas prêt lorsque vous avez appliqué la fonction .ajaxForm. Assurez-vous que vous ajaxifying le formulaire dans $(document).ready:

$(function() { 
    var options = { 
     dataType: "json", 
     clearForm: true, 
     beforeSubmit: hideUpdateField, 
     success: handleNewsPostSuccess 
    }; 
    $('div#Updates form').ajaxForm(options); 
}); 

Aussi, si votre rappel handleNewsPostSuccess vous recréez le formulaire dans le DOM le non ajaxForm pourrait plus s'y appliquer et la deuxième fois que vous essayez de le soumettre effectuera un POST normal.