2011-03-22 16 views
38

Bắt đầu thử nghiệm các ứng dụng jQuery của tôi với IE9 không. Có vẻ như tôi có thể gặp rắc rối ở đây. Tôi nhận thấy rằng khi tôi trả lại dữ liệu JSON trở lại phương thức Javascript, tôi luôn nhận được Lời nhắc này cho biết: "Bạn có muốn mở hoặc lưu tệp này không?" và cung cấp cho tôi 3 nút: Mở, Lưu và Hủy. Tất nhiên, javascript của tôi đang thực hiện các hành động dựa trên các giá trị được đặt trong đối tượng JSON nhưng vì IE9 không truyền nó cho kịch bản, tôi không thể thực hiện hành động theo dõi từ đó.Dữ liệu JSON IE9 "bạn có muốn mở hoặc lưu tệp này"

Bất kỳ ai khác đang gặp sự cố này? Đây là ảnh chụp nhanh. enter image description here

+3

tiêu đề HTTP được gửi lại bằng phản hồi JSON từ máy chủ là gì? – BigFatBaby

+0

Bạn đã thử cùng một trang trong một trình duyệt khác như FF chưa? Bạn đã bật javascript trong IE 9 chưa? – Xhalent

+0

Bạn gần như chắc chắn gửi nhầm loại nội dung MIME hoặc thực hiện điều gì đó rất kỳ quặc như gửi phản hồi JSON trở lại thẻ IFRAME. URL repro sẽ cho phép chúng ta dễ dàng nhìn thấy. (Bật và tắt JS sẽ không tạo ra sự khác biệt nào cả). – EricLaw

Trả lời

2

Thực ra, bạn đã đúng @EricLaw. Sau khi thiết lập kiểu nội dung trong kết quả Json, nó hoạt động. tôi đã có thêm những dòng sau:

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

Điều này là không làm việc cho tôi ở tất cả các – Dan

+0

Xem câu trả lời của tôi dưới đây, nó sẽ giúp: http://stackoverflow.com/questions/5388893/ie9-json-data-do-you-want-to-open-or-save- tập tin này/15911008 # 15911008 – Chris

21

Nếu bất cứ ai đang sử dụng ASP.net MVC và cố gắng để khắc phục vấn đề này - tôi đã sử dụng những sản phẩm sau được xây dựng trong các phương pháp trong khuôn khổ MVC. Chỉ cần cập nhật Loại nội dung và mã hóa trên 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); 
} 

Điều này đã khắc phục sự cố cho tôi!

+0

Tôi thấy lớp 'Json' nằm trong' System.Web.Helpers', nhưng tôi nhận được thông báo "" Phương thức, đại biểu hoặc sự kiện được mong đợi "" và nó sẽ không xây dựng. Biết cơ hội những gì tôi đang mất tích? – atconway

+1

Với phương pháp này, nhà phát triển phải nhớ đặt kiểu nội dung thành "text/html" mỗi khi họ trả về JSON. Nếu họ quên thì sao? Không phải là một giải pháp tốt! Thêm vào đó, trả về dữ liệu JSON và nói với trình duyệt rằng đó là nội dung HTML về cơ bản là sai! – Mosh

6

Tôi cũng phải đối mặt với vấn đề này ngày hôm qua với WebAPI đã trả về danh sách URL (của các tệp được tải lên không đồng bộ).

Chỉ cần đặt loại nội dung thành "text/html" thay vì mặc định "application/json; charset = UTF-8" của dịch vụ WebAPI. Tôi nhận được phản hồi như một chuỗi JSON và sau đó sử dụng $ .parseJSON để chuyển đổi nó thành đối tượng 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

Cảm ơn bạn đã phản hồi về webapi. Tôi có vấn đề chính xác này và thiết lập ContentType làm việc. Tôi đã cố gắng thiết lập "text/html" thông qua quá tải CreateResponse, nhưng MVC ném một ngoại lệ nói rằng nó không thể tìm thấy một trình định dạng cho điều đó (chỉ hỗ trợ json và xml). –

+0

Tôi cũng phải đối mặt với cùng một vấn đề, tôi đã thử giải pháp này nhưng nó tạo ra lỗi chuyển đổi: Không thể chuyển đổi hoàn toàn loại 'System.Net.Http.HttpResponseMessage' thành 'System.Threading.Tasks.Task Vipul

+0

@Vipul: Tôi nghĩ có gì đó sai với phương thức Nhiệm vụ của bạn, bạn có thể sao chép mã của mình ở đây không? –

3

Trong trường hợp của tôi khi contentType trong tiêu đề phản hồi là "application/json; charset = UTF-8", IE 9 hiển thị lời nhắc đó. Nhưng thay đổi thành "text/html" thì lời nhắc không hiển thị, mặc dù tất cả các trình duyệt rái cá đều ổn với "application/json; charset = UTF-8".

+0

Trên thực tế IE8 cũng bị hỏng và cần thay đổi. – philw

13

(trả lời ban đầu được đăng cho this question.)

Nếu sử dụng MVC, một trong những cách xử lý này là để thực hiện một bộ điều khiển cơ sở, trong đó bạn ghi đè phương pháp (ẩn) Json (object) như sau:

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

Bây giờ, điều khiển của bạn có thể tất cả các thừa kế ExtendedController và chỉ cần gọi return Json(model); ...

  • mà không sửa đổi các kiểu nội dung câu trả lời cho những trình duyệt mà chơi độc đáo (không < = IE9!)
  • mà không cần phải nhớ để sử dụng Json(data, "text/plain") trong các phương pháp hành động Ajax khác nhau của bạn

này làm việc với các yêu cầu json mà sẽ khác hiển thị thông báo "Mở hoặc Lưu" trong IE8 & IE9 chẳng hạn như các thông báo được thực hiện bởi jQuery File Upload

+1

Tôi đã sử dụng "text/html" thay vì "text/plain", nhưng điều đó có thể do việc triển khai cụ thể mà tôi đã sử dụng trên máy khách. Chỉ cần đề cập đến nó cho một người có cùng một vấn đề. –

Các vấn đề liên quan