web-dev-qa-db-ja.com

IE9 JSON Data「このファイルを開きますか、保存しますか」

IE9でjQueryアプリケーションのテストを開始しました。私はここでいくつかの問題に直面しているようです。 JSONデータをJavascriptメソッドに返すと、「このファイルを開くか保存しますか?」というプロンプトが常に表示されることに気付きました。開く、保存、キャンセルの3つのボタンが表示されます。もちろん、私のJavaScriptはJSONオブジェクトに設定された値に基づいてアクションを実行していますが、IE9はそれをスクリプトに渡さないため、それ以降はフォローアップアクションを実行できません。

この問題に直面している他の誰か?これがスナップショットです。enter image description here

38
Anup Marwadi

実際には、あなたは正しい@EricLawでした。 Jsonの結果にコンテンツタイプを設定した後、動作しました。次の行を追加する必要がありました。

 result.ContentEncoding = System.Text.Encoding.UTF8; 
 result.ContentType = "application/json; charset=UTF-8
2
Anup Marwadi

誰かがASP.net MVCを使用していて、この問題を修正しようとしている場合、次のMVCフレームワークの組み込みメソッドを使用しました。 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);
}

これで問題は解決しました!

21
Deano

(元々 この質問 に対して投稿された回答)

MVCを使用する場合、これを処理する1つの方法は、次のようにJson(object)メソッドをoverride(非表示)にするベースコントローラーを実装することです。

_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);
    }
}
_

これで、コントローラーはすべてExtendedControllerを継承し、単にreturn Json(model);を呼び出すことができます...

  • うまく再生するブラウザの応答コンテンツタイプを変更せずに(<= IE9ではありません!)
  • さまざまなAjaxアクションメソッドでJson(data, "text/plain")を使用することを忘れずに

これは、そうでなければ jQuery File Upload によって作成されたものなど、IE8およびIE9で「開くまたは保存」メッセージを表示するjson要求で機能します。

13
Chris

また、昨日(非同期にアップロードされたファイルの)URLのリストを返すWebAPIでこの問題に直面しました。

コンテンツタイプを、WebAPIサービスのデフォルトの「application/json; charset = UTF-8」の代わりに「text/html」に設定するだけです。 JSON文字列として応答を取得し、$。parseJSONを使用して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);
});
6
Tien Do

私の場合、応答ヘッダーのcontentTypeが「application/json; charset = UTF-8」の場合、IE 9はそのプロンプトを示します。しかし、「text/html」に変更すると、プロンプトはショー、すべてのカワウソブラウザーは「application/json; charset = UTF-8」で問題ありませんが。

3
Rich