2011-12-21 24 views
12

Tôi đã cố gắng trả lại Json từ hành động của mình và sau đó IE đã cố gắng tải xuống và cho tôi thấy hộp thoại lưu. Tôi đã thử nghiệm nó trong Firefox, và ở đó nó hoạt động tốt.IE cố gắng tải xuống JSON trong ASP. NET MVC 3

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

Lý do của hành vi đó là gì và làm cách nào để giải quyết vấn đề đó?

Sau đó trong Javascript phần tôi cố gắng này

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

Nhưng IE không hiển thị cảnh báo nào. Nó mang lại cho tôi lưu hộp thoại.

Tôi đã cố gắng thay đổi "application/json" với "text/plain" và lưu hộp thoại biến mất, nhưng tôi chưa thể thấy cảnh báo. Tôi đang thiếu gì?

EDIT:

Đây là complect Javascript của tôi, tôi đang sử dụng Valums qquploader (ex-Ajaxupload) để tải lên hình ảnh

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

tôi đã thử nghiệm với alert("success"); phần khác của tôi và chuyển tiếp json là "text/plain" và sau đó tôi thấy cảnh báo. Nhưng trong thời gian đó responseJSON.success != false cho tôi. Bạn có đề xuất gì về điều đó không?

+1

Bạn gọi hành động của mình như thế nào? Bạn có thể cho chúng tôi thấy javascript phía khách hàng không? –

+0

Bất kỳ tiện ích bổ sung hoặc cài đặt cục bộ nào của IE? Kiểm tra các loại MIME đã đăng ký của bạn. – asawyer

+0

Kiểm tra chỉnh sửa của tôi Tôi đã viết một phần của Javascript. @ John Gibb, tôi nghĩ việc tôi gọi hành động của mình là không quan trọng. –

Trả lời

17

Tôi đã giải quyết điều đó với thủ thuật này

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

Và bây giờ nó hoạt động. Nhưng tôi có thể giải thích tại sao nó hoạt động với text/html, và không làm việc với ứng dụng/json và text/plain. Đầu tiên là cố gắng tải xuống JSON và thứ hai là trả lại các thuộc tính chưa được xác định cho các trường JSON.

+0

Tôi đã có cùng một vấn đề chính xác, và làm cho nó hoạt động bằng cách thay đổi từ "application/json" thành "text/html". Tôi đã viết về những phát hiện của mình trong một bài đăng blog, có thể điều đó có thể cung cấp cho bạn một số thông tin khác: http://blog.degree.no/2012/09/jquery-json-ie8ie9-treats-response-as-downloadable-file/ – Andreas

+1

IE không có json sẵn có trong trình duyệt cho đến IE8. Điều này đã gây ra rất nhiều vấn đề. Trong các trang web, bạn có thể sửa lỗi này bằng cách thêm json2.js. có sẵn từ https://github.com/douglascrockford/JSON-js – amesh

2

Tôi đã sử dụng trình tải lên tương tự này và có cùng sự cố.

Nó phải làm với các tiêu đề yêu cầu được gửi. IE cần yêu cầu để có một tiêu đề chấp nhận cho biết json.

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

Nếu bạn chèn này sau khi dòng này:

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

trong file js (mỏ được gọi fileuploader.js) thì bạn nên không còn có vấn đề, và không cần phải chỉ ra văn bản/html trong trở lại của bạn.

p.s. Tôi đã nhận xét ra dòng nội dung, nhưng tôi không còn chắc chắn tại sao. Nếu chỉ cần thêm dòng chấp nhận này không hoạt động, hãy thử chú thích tiêu đề kiểu nội dung.

Chỉnh sửa:

Tôi đã xem lại tệp của mình và dường như cũng đã thực hiện một thay đổi khác.

Thay vì dòng:

xhr.send(file) 

tôi đặt tại:

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

này được đưa ra sau dòng setrequesrheader trên.

Tôi không chắc liệu thay đổi này có hiệu quả đối với tất cả các mục đích sử dụng hay không, như tải lên nhiều tệp. Tôi chỉ tải lên một hình ảnh duy nhất để tôi sử dụng.

+0

Tôi đã thử cả hai cách với nhận xét và không nhận xét dòng đó, nhưng kết quả cũng giống nhau. IE đề nghị mi tải xuống JSON đó. –

+0

Có vẻ như tôi đã bỏ lỡ một thay đổi khác mà tôi đã thực hiện trong cùng chức năng đó. Tôi đã chỉnh sửa bài đăng của mình. Xin lỗi vì điều đó. –

+0

Không quan trọng, nó không hoạt động đối với tôi. –

8

Sự cố này xảy ra khi sử dụng plugin tải lên sử dụng iframe để tải lên bằng IE (được thử nghiệm trên 9.0).

IE đặt tiêu đề Accept: text/html, , application/xhtml+xml, */* và vì vậy khi bạn trả lời bằng Content-type: application/json, nó giả định đó là tệp (hoặc ít nhất đó là giải thích duy nhất tôi có thể tìm thấy trên web).

Do đó, để phá vỡ điều đó, bạn cần đặt Content-type: text/html hoặc Content-type: text/plain.

Tôi khuyên bạn nên triển khai điều này bằng cách sử dụng ActionFilter; thay vì thay đổi kiểu nội dung theo cách thủ công, phát hiện IE và POST nhiều lần và thay đổi loại nội dung phù hợp.

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