2011-03-22 50 views
38

開始用IE9測試我的jQuery應用程序。看起來我可能會在這裏遇到一些麻煩。 我注意到當我將JSON數據返回給Javascript方法時,我總是得到這個提示:「你想打開還是保存這個文件?」併爲我提供3個按鈕:打開,保存和取消。當然,我的JavaScript正在基於JSON對象中設置的值進行操作,但由於IE9沒有將它傳遞給腳本,因此我無法執行後續操作。IE9 JSON數據「你想打開還是保存這個文件」

其他人面臨這個問題?這是一個快照。 enter image description here

+3

所做的那些IE9從服務器返回JSON響應的HTTP頭是什麼? – BigFatBaby 2011-03-22 09:08:36

+0

您是否在不同的瀏覽器(例如FF)中嘗試了相同的頁面?你在IE 9中啓用了JavaScript嗎? – Xhalent 2011-03-22 09:10:31

+0

你幾乎肯定會發送錯誤的MIME Con​​tent-Type,或者做一些非常奇怪的事情,比如將JSON響應發送回IFRAME標記。重播URL可以讓我們輕鬆看到。 (啓用與禁用JS完全沒有區別)。 – EricLaw 2011-03-22 13:32:52

回答

2

其實你是對的@EricLaw。在Json結果中設置內容類型之後,它工作。 我不得不添加下面幾行:

result.ContentEncoding = System.Text.Encoding.UTF8; 
result.ContentType = "application/json; charset=UTF-8 
+4

這不是爲我工作 – Dan 2012-03-21 18:01:23

+0

看到我的答案在下面,它應該有所幫助:http://stackoverflow.com/questions/5388893/ie9-json-data-do-you-want-to-open-or-save-這個文件/ 15911008#15911008 – Chris 2013-04-25 13:19:32

21

如果有人使用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); 
} 

這解決了我的問題!

+0

我看到'Json'類在'System.Web.Helpers'中,但我得到一個''方法,委託或事件預期的消息,它不會生成。偶然知道我錯過了什麼? – atconway 2013-07-30 21:20:02

+1

通過這種方法,開發人員每次返回JSON時都必須記得將content-type設置爲「text/html」。如果他們忘記了呢?不是很好的解決方案!另外,返回JSON數據並告訴瀏覽器它是HTML內容是根本錯誤的! – Mosh 2013-12-04 01:48:08

6

昨天我也遇到了這個問題,WebAPI返回了一列URL(異步上傳文件)。

只需將WebAPI服務的內容類型設置爲「text/html」而不是默認的「application/json; charset = UTF-8」即可。我以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); 
}); 
+0

感謝您對webapi的迴應。我有這個確切的問題,並設置ContentType的工作。我嘗試通過CreateResponse重載設置「text/html」,但MVC拋出一個異常,說明找不到格式化程序(僅支持json和xml)。 – 2012-11-12 21:37:51

+0

我也面臨同樣的問題,我試過這個解決方案,但它產生的轉換錯誤:不能隱式地將類型'System.Net.Http.HttpResponseMessage'轉換爲'System.Threading.Tasks.Task Vipul 2012-11-27 05:43:15

+0

@Vipul:我認爲你的任務方法有問題,你可以在這裏複製你的代碼嗎? – 2012-11-28 09:55:16

3

在我的情況時的contentType響應頭是 「應用/ JSON;字符集= UTF-8」,則IE 9示出了提示。但更改爲「文本/ HTML」,然後提示不顯示,雖然所有水獺瀏覽器與「應用程序/ JSON;字符集= UTF-8」罰款。

+0

其實IE8也是壞的,需要改變。 – philw 2016-05-06 09:53:18

13

(答案最初發布的this question

如果使用MVC,處理這種情況如下實施基本控制器中,你覆蓋(隱藏)JSON(對象)方法的一種方法:

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")

這適用於JSON請求,否則將在IE8中顯示「打開或保存」消息& IE9例如由jQuery File Upload

+1

我使用「text/html」而不是「text/plain」,但這可能是由我在客戶端上使用的特定實現引起的。只要提到它有同樣的問題的人。 – 2013-05-20 22:47:46

相關問題