2013-01-11 28 views
5

gọi ajax của tôi trông như thế nàyLiên tục nhận 400 (Yêu) về jquery ajax đường bưu điện đến bộ điều khiển MVC

$.ajax({ //actually approve or reject the promotion 
       url: url, 
       type: "POST", 
       data: '{'+data.PromotionId+','+data.UserId+','+data.ReasonText+'}', 
       dataType: "json", 
       //contentType: "application/json; charset=utf-8", 
       success: function (data) { 
        if (indicator == 'A') { 
         alert('Promotion approved successfully!'); 
        } 
        else { 
         alert('Promotion rejected successfully.'); 
        } 

        var homelink = '<%: Url.Action("Index","Home") %>'; 
        window.location.href = (homelink); 


        returndata = data; 
       }, 
       error: function (xhRequest, ErrorText, thrownError) { 
        alert("Failed to process promotion correctly, please try again"); 
        console.log('xhRequest: ' + xhRequest + "\n"); 
        console.log('ErrorText: ' + ErrorText + "\n"); 
        console.log('thrownError: ' + thrownError + "\n"); 
       } 
      }); 

Và điều khiển MVC của tôi trông như thế này:

[HttpPost] 
    public HttpResponseMessage ApprovePromotion(PromotionDecision decision) 
    { 
     if (ModelState.IsValid && decision != null) 
     { 
      bool status = PromotionBo.ApprovePromotion(decision); 
      if (status == true) 
       return new HttpResponseMessage(HttpStatusCode.OK); 
     } 
     return new HttpResponseMessage(HttpStatusCode.BadRequest); 
    } 

Tôi đã nghĩ cú pháp là chính xác trên cả hai trong số này tuy nhiên mỗi khi tôi thực hiện cuộc gọi ajax tôi nhận được một phản ứng 400. Tôi đang làm gì sai?

Trả lời

10

Bạn đang gửi một chuỗi JSON hoàn toàn bị hỏng và không hợp lệ đến máy chủ. Điều bình thường là hành động điều khiển từ chối nó. Ngoài ra, bạn đã đưa vào nhận xét tham số contentType chỉ định rằng bạn muốn gửi yêu cầu JSON.

Vì vậy, đây là cách chính xác để làm theo yêu cầu:

$.ajax({ //actually approve or reject the promotion 
    url: url, 
    type: "POST", 
    data: JSON.stringify({ 
     // Those property names must match the property names of your PromotionDecision view model 
     promotionId: data.PromotionId, 
     userId: data.UserId, 
     reasonText: data.ReasonText 
    }), 
    contentType: "application/json; charset=utf-8", 
    success: function (data) { 
     if (indicator == 'A') { 
      alert('Promotion approved successfully!'); 
     } 
     else { 
      alert('Promotion rejected successfully.'); 
     } 

     var homelink = '<%: Url.Action("Index","Home") %>'; 
     window.location.href = (homelink); 

     returndata = data; 
    }, 
    error: function (xhRequest, ErrorText, thrownError) { 
     alert("Failed to process promotion correctly, please try again"); 
     console.log('xhRequest: ' + xhRequest + "\n"); 
     console.log('ErrorText: ' + ErrorText + "\n"); 
     console.log('thrownError: ' + thrownError + "\n"); 
    } 
}); 

Chú ý cách tôi đang sử dụng JSON.stringify phương pháp đó là nguyên bản tích hợp vào các trình duyệt hiện đại để đảm bảo rằng các JSON được gửi đến máy chủ là một cách chính xác và tất cả các giá trị đều được mã hóa chính xác. Và nếu bạn cần hỗ trợ các trình duyệt từ thời kỳ đồ đá, bạn có thể bao gồm tập lệnh json2.js vào trang của mình để xác định phương thức JSON.stringify.

Nhận xét quan trọng: Tuyệt đối không bao giờ tạo chuỗi JSON bằng cách sử dụng chuỗi nối như trong mã của bạn.

Ngoài ra nếu bạn không muốn gửi một JSON yêu cầu bạn có thể gửi một application/x-www-form-urlencoded yêu cầu tiêu chuẩn:

$.ajax({ //actually approve or reject the promotion 
    url: url, 
    type: "POST", 
    data: { 
     promotionId: data.PromotionId, 
     userId: data.UserId, 
     reasonText: data.ReasonText 
    }, 
    success: function (data) { 
     if (indicator == 'A') { 
      alert('Promotion approved successfully!'); 
     } 
     else { 
      alert('Promotion rejected successfully.'); 
     } 

     var homelink = '<%: Url.Action("Index","Home") %>'; 
     window.location.href = (homelink); 

     returndata = data; 
    }, 
    error: function (xhRequest, ErrorText, thrownError) { 
     alert("Failed to process promotion correctly, please try again"); 
     console.log('xhRequest: ' + xhRequest + "\n"); 
     console.log('ErrorText: ' + ErrorText + "\n"); 
     console.log('thrownError: ' + thrownError + "\n"); 
    } 
}); 

này nên làm việc cùng một cách và hành động điều khiển sẽ có thể để ràng buộc đúng mô hình.

Lưu ý: Tôi nhận thấy rằng bạn đã sử dụng dòng sau trong lần gọi lại thành công: returndata = data;. Điều này khiến tôi tin rằng bạn đang cố gắng tiêu thụ kết quả của một yêu cầu AJAX không đồng bộ bên ngoài sự gọi lại thành công mà không thể thực hiện được. Tôi không biết bạn đang làm gì với biến số returndata này nhưng tôi cảm thấy nó sai.

+0

vâng tôi đã nghĩ rằng nó đã bị hỏng bằng cách nào đó và mã ở trên là những gì xảy ra sau khi bạn đã làm việc trên nó trong hai giờ liên tục và đã nhận được ngày càng thất vọng. Tôi sẽ cung cấp cho nó một đi và đánh dấu nó như là câu trả lời khi nó hoạt động. – Pseudonym

+0

Nó hoạt động hoàn hảo, nhờ câu trả lời hữu ích và mang tính thông tin của bạn. – Pseudonym

+0

Câu trả lời hay ... – Mark

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