2011-12-21 2 views
12

私は自分のアクションからJsonを返そうとしていましたが、その後IEはそれをダウンロードしようとしてダイアログを保存してくれました。 Firefoxでテストしましたが、正常に動作します。IEはASPでJSONをダウンロードしようとします。 NET MVC 3

return Json(new { success = false, message = ex.Message }, "application/json"); 

このような動作の理由は何ですか?その問題をどのように解決できますか?

その後Javascriptの部分で、私はこの

if (responseJSON.success == false) { 
         alert(responseJSON.message); 
         cancel(); 
        } 

を試してみてくださいしかし、IEはとにかく、警告は表示されません。それは私にダイアログを保存します。

"application/json""text/plain"に変更しようとしましたが、保存ダイアログが表示されなくなりましたが、まだ警告が表示されません。私は何が欠けていますか?

編集:ここでは

は私complect Javascriptのですが、私はアップロードした画像

var uploader = new qq.FileUploader({ 
       element: document.getElementById("image-upload"), 
       action: '/Home/ImageUpload', 
       allowedExtensions: ['jpg', 'png', 'gif'], 
       sizeLimlit: 2048,onComplete: function (id, fileName, responseJSON) { 
        if (responseJSON.success == false) { 
         alert(responseJSON.message); 
         cancel(); 
        } 
        else { 
         alert("success"); 
          //some code here 
         } 
        } 
        }); 

私は私の他の部分にalert("success");でテストし、JSONを転送していたためValumsのqquploader(EX-Ajaxupload)を使用しています"text/plain"とし、その後私は警告を見た。しかしその時にはresponseJSON.success != false私のために。あなたはそれについて何か提案していますか?

+1

あなたの行動をどのように呼びますか?あなたは私たちにクライアント側のJavaScriptを表示できますか? –

+0

IEのアドオンやローカル設定の調整はありますか?登録済みのMIMEタイプを確認してください。 – asawyer

+0

私の編集をチェックする私はすでにJavaScriptの一部を書いています。 @John Gibb、私は自分の行動をどのように呼び出すかは関係ありません。 –

答えて

17

私が解決したことを、このトリック

return Json(new { success = false, message = ex.Message }, "text/html"); 

そして、それは動作します。しかし、私は誰もテキスト/ htmlで動作する理由を説明することができ、application/jsonとtext/plainで動作しませんでした。最初にJSONをダウンロードしようとしています.2番目はJSONフィールドの未定義のプロパティを返しています。

+0

私はまったく同じ問題を抱えていて、 "application/json"から "text/html"に変更して動作させました。私はブログの投稿で私の発見について書いた、多分あなたにいくつかの詳細を与えることができます:http://blog.no/2012/09/jquery-json-ie8ie9-treats-response-as-downloadable-file/ – Andreas

+1

IE8はIE8までブラウザーにinbuilt jsonを持っていません。これは非常に多くの問題を引き起こしていました。 Webページでは、json2.jsを追加することでこれを修正できます。これはhttps://github.com/douglascrockford/JSON-jsから入手できます。 – amesh

2

は、おそらくあなたは(IE用/プレーンテキストを試してみてください)あなたのJSONコンテンツの正しいMIMEタイプを設定していない

参照:What problems may using the MIME type application/json cause?

+0

私の質問を編集しました。あなたはそれを見てみることができますか? –

2

私はこの同じアップローダを使用していて、同じ問題がありました。

送信されたリクエストヘッダーと関係があります。 IEは、jsonを示す受け入れヘッダを持つ要求を必要とします。

xhr.setRequestHeader("Accept", "application/json, text/javascript, */*; q=0.01"); 

あなたは、この行の後にこれを挿入する場合は、次のjsファイルで

xhr.setRequestHeader("Content-Type", "application/octet-stream"); 

(私はfileuploader.jsと呼ばれます)、あなたは、もはや問題はないはず、と指示する必要はありません。 text/htmlを返します。

p.s. コンテンツタイプの行をコメントアウトしましたが、理由がわからなくなりました。 accept行を追加するだけでは機能しない場合は、content-typeヘッダもコメントアウトしてみてください。

編集:

私は再び私のファイルを見て、また別の変更を行ったように思えます。代わりに、行の

:私は入れ

xhr.send(file) 

var formData = new FormData(); 
formData.append("image", file); 
xhr.send(formData); 

これは、上記setrequesrheader行の後に来ます。

複数のファイルのアップロードなど、この変更がすべての用途で有効かどうかはわかりません。私は私の使用のために単一のイメージをアップロードするだけです。

+0

私はコメントをつけて両方の方法を試してみましたが、その行にはコメントしませんでしたが、結果は同じです。 IEはそのJSONをダウンロードするように提案しています。 –

+0

私は同じ機能で作った別の変更を見逃したように見えます。私は自分の投稿を編集しました。申し訳ありません。 –

+0

うまくいけば、それは私にとってはうまくいかない。 –

8

この問題は、iframeを使用してアップロードプラグインを使用してIE(9.0でテスト済み)でアップロードを行う場合に発生します。

IEはヘッダーAccept: text/html, , application/xhtml+xml, */*を設定していますので、Content-type: application/jsonと返信すると、ファイルであると見なされます(少なくともウェブ上で見つかる唯一の説明です)。

したがって、これを回避するには、Content-type: text/htmlまたはContent-type: text/plainと設定する必要があります。

ActionFilterを使用して実装することをおすすめします。手動でコンテンツタイプを変更する代わりに、IEとマルチパートPOSTを検出し、それに応じてコンテンツタイプを変更します。