2010-02-04 19 views
13

Tôi có một số jQuery trông như thế này:Làm thế nào tôi có thể thiết lập contentType của một bài đăng ajax jQuery để ASP.NET MVC có thể đọc nó?

$.ajax({ 
    type: "POST", 
    url: "/Customer/CancelSubscription/<%= Model.Customer.Id %>", 
    contentType: "application/json", 
    success: refreshTransactions, 
    error: function(xhr, ajaxOptions, thrownError) { 
     alert("Failed to cancel subscription! Message:" + xhr.statusText); 
    } 
}); 

Nếu hành động được gọi là gây ra một ngoại lệ nó cuối cùng sẽ được chọn bởi Global.asax Application_Error nơi tôi có một số mã như thế này:

var ex = Server.GetLastError(); 
if (Request.ContentType.Contains("application/json")) 
{ 
    Response.StatusCode = 500; 
    Response.StatusDescription = ex.Message; 
    Response.TrySkipIisCustomErrors = true; 
} 
else 
{ 
    // some other way of handling errors ... 
} 

Khi tôi thực thi tập lệnh đăng bài, Request.ContentType luôn là chuỗi trống và do đó không nhấn vào khối đầu tiên nếu khối. Có một số giá trị khác mà tôi nên đặt trong ajax "contentType" không? Hoặc là có một cách khác để tôi nói với asp.net rằng loại nội dung nên là "application/json"?

Làm rõ

Mục đích tôi đang cố gắng để đạt được là phải vượt qua các thông điệp ngoại lệ trở lại trường hợp lỗi ajax. Hiện tại, mặc dù khối IF đang bị bỏ qua, sự kiện lỗi sẽ ném một hộp cảnh báo chính xác nhưng thông báo là "Không tìm thấy".

Như bạn có thể thấy tôi đang cố gắng đặt thông báo lừa đảo cho Response.StatusDescription mà tôi tin rằng xhr.statusText trong lỗi ajax được đặt thành.

Trả lời

18

Accordiing bài viết này : http://encosia.com/2008/03/27/using-jquery-to-consume-aspnet-json-web-services/ "jQuery không đặt đúng loại nội dung được chỉ định khi không có dữ liệu được bao gồm."

$.ajax({ 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    url: "WebService.asmx/WebMethodName", 
    data: "{}", 
    dataType: "json" 
}); 
+1

Điều này đã thay đổi trong jQuery 1.4, bây giờ nó luôn gửi loại nội dung ... lưu ý quan trọng :) http://api.jquery.com/jQuery.ajax/ –

+0

Tôi đã thử nghiệm phương pháp này và nó hoạt động. Chúng tôi đang sử dụng jQuery 1.3.2 tại đây. Từ những gì Nick mô tả nó giống như mã của tôi trong câu hỏi nên làm việc với 1,4. –

+1

Đây là câu trả lời đúng. Sửa đổi cài đặt kiểu nội dung của đối tượng XHR trong beforeSend không hoạt động ngay trong một số trình duyệt và dịch vụ sẽ trả về XML thay vì JSON. –

6

Để đặt tiêu đề tùy chỉnh trong XmlHTTPRequest, bạn cần sử dụng hàm tùy chọn beforeSend() trong Cuộc gọi AJAX của jQuery. Sử dụng chức năng đó để đặt tiêu đề bổ sung, như được mô tả trong jQuery API documenation.

Ví dụ:

$.ajax({ 
    type: "POST", 
    url: "/Customer/CancelSubscription/<%= Model.Customer.Id %>", 
    beforeSend: function(xhr) { 
     xhr.setRequestHeader("Content-type", "application/json"); 
    }, 
    success: refreshTransactions, 
    error: function(xhr, ajaxOptions, thrownError) { 
     alert("Failed to cancel subscription! Message:" + xhr.statusText); 
    } 
    }); 
0

Nếu bạn luôn luôn trở về json lỗi Ajax, sau đó bạn chỉ có thể sử dụng sau đây để phát hiện rằng đó là một cuộc gọi Ajax:

// jQuery sets a header of 'x-requested-with' in all requests 
      string[] ajaxHeader = httpRequest.Headers.GetValues("x-requested-with"); 
      if (ajaxHeader != null && ajaxHeader.Length > 0) 
      { 
       return ajaxHeader[0].Equals("XMLHttpRequest", StringComparison.InvariantCultureIgnoreCase); 
      } 
      return false; 
0

Sử dụng tính năng này để loại nội dung mặc định.

$ .ajaxSetup ({contentType : "application/json; charset = utf-8", });

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