2

私の MVC3 アプリは、ユーザーからサーバーにドキュメントをアップロードします。エラーがあればそれを表示するために JsonResult を返します。

  [HttpPost] 
    public JsonResult SaveDocument(DocumentModel model, HttpPostedFileBase postedFile)
    {
         //my wonderful code
         return Json(new { success = true, message="ok" });

     }

リクエストを送信する方法は次のとおりです。

 var isSubmitting = false;
  var addDocumentOptions = {
       beforeSubmit: beforeAddDocumentSubmit,  // pre-submit callback 
      success: afterDocumentSubmit  // post-submit callback 
  };
  $('#btnCreateDocument').click(function (e) {
      e.preventDefault();
      $('#divError').html('');
      if (!isSubmitting) {
          $('#createDocForm').submit();
      }
    });

アップロードが完了すると、次の JavaScript 関数が実行されます。

    function afterDocumentSubmit(responseText, statusText, xhr, $form) {
        if (responseText.success) {
            //no errors
          } else {
             $('#divError').html('Error: ' + responseText.message);
     }
   }

FF、Chrome などでは、私の JavaScript コードは問題なく動作しますが、IE では、ブラウザーは Json の結果をテキストとしてダウンロードしようとします。表示されるべきではないダウンロード/ファイルを開くダイアログ ボックスが表示されます。IE が Json の結果をダウンロードせず、他のブラウザーのように動作するようにするにはどうすればよいですか? ありがとう

4

3 に答える 3

9

Java 上の Spring MVC で同じことを行う同様の問題に遭遇しました。問題は、Spring が JSON 結果の content-type を として返すことでした。これによりapplication/json、IE はそれをダウンロードしたくなるようです。content-type をtext/plain;に変更してみてください。この場合、IE はファイルのダウンロードを要求しません。似たようなことがここで起こっているのではないかと思います。

あなたは試すことができます:

return Json(new { success = true, message = "ok" }, "text/plain");

あなたの新しい問題への対応: 問題は、それresponseTextが単なる文字列であることです。あなたがする必要があるのは、それを Javascript オブジェクトに変換することです。次のように実行できます。

var response = JSON.parse(responseText);
if(response.success) {
   ...
}

ほとんどのブラウザがサポートしてJSON.parse()います。準拠していないブラウザーで問題が発生した場合は、いつでもJSON Javascript ライブラリを使用できます。

于 2012-06-29T17:29:16.980 に答える
2

大まかな推測: AJAX を使用してファイルをアップロードできるようにするjquery.formプラグインを使用しており、次のようなドキュメントを読んでいません。

XMLHttpRequest レベル 2 をサポートするブラウザは、ファイルをシームレスにアップロードでき、アップロードの進行に合わせて進行状況の更新も取得できます。古いブラウザでは、XMLHttpRequest オブジェクトのレベル 1 実装を使用してファイルをアップロードできないため、iframe を含むフォールバック テクノロジが使用されます。これは一般的なフォールバック手法ですが、固有の制限があります。iframe 要素は、フォームの送信操作のターゲットとして使用されます。これは、サーバーの応答が iframe に書き込まれることを意味します。これは、応答の種類が HTML または XML の場合は問題ありませんが、応答の種類がスクリプトまたは JSON の場合はうまく機能しません。どちらにも、HTML マークアップで見つかった場合にエンティティ参照を使用して表現する必要がある文字が含まれていることがよくあります。

iframe モードを使用する場合のスクリプトおよび JSON 応答の課題を説明するために、フォーム プラグインではこれらの応答を textarea 要素に埋め込むことができます。ブラウザ。ただし、フォームにファイル入力がない場合、リクエストは通常​​の XHR を使用してフォームを送信します (iframe ではありません)。これにより、テキストエリアをいつ使用し、いつ使用しないかを知るというサーバー コードの負担が大きくなります。

これを読んだので、この投稿で例示したように、コードを IE で動作させたい場合は、それぞれのアクションを実行する必要があります。

于 2012-06-29T17:31:34.560 に答える
1

適切な JsonResult の戻り値は次のようになります。

[HttpPost] 
public JsonResult SaveDocument(DocumentModel model, HttpPostedFileBase postedFile)
{
    ...
    return Json(new { success = true, message="ok" }, "application/json; charset=utf-8", JsonRequestBehavior.AllowGet);
}
于 2012-06-29T17:37:07.063 に答える