2013-08-27 62 views
5

Tôi đang gặp sự cố với cuộc gọi ajax của mình, hãy thực hiện theo phương thức web.api của tôi. Nếu tôi gỡ bỏ lệnh Guid orderId khỏi cả api và js, cuộc gọi sẽ chuyển nó thành bộ điều khiển, nhưng đối tượng pizza rỗng. Nếu tôi chuyển hướng dẫn trong URL, nó cũng làm cho nó vào bộ điều khiển nhưng không có bánh pizza. Vui lòng giải thích lý do tại sao điều này không hiệu quả hoặc giúp tôi hoạt động.Cuộc gọi Api Web đang trả về lỗi 404 với GUID được chuyển làm thông số

JS:

var savePizza = function (orderId, pizza) { 
    var dataCall = $.ajax(config.savePizzaUrl, { 
     data: ko.toJSON({ orderId: orderId, pizza: pizza }), 
     type: "post", 
     contentType: "application/json" 
    }); 

    return Q.when(dataCall); 
}; 

Web Api:

Objects
[HttpPost] 
    public RequestReturn<Guid> SavePizza(Guid orderId, Pizza pizza) 
    { 
     return PizzaRequests.SavePizza(orderId, pizza); 
    } 

JS:

var pizza = function (data) { 
    this.Id = data.Id; 
    this.Size = new size(data.Size); 
    this.SizeId = data.SizeId; 
    this.Toppings = $.map(data.Toppings, function(item) {return new topping(item);}); 
}; 
var topping = function (data) { 
    this.Id = data.Id; 
    this.Name = data.Name; 
    this.Price = data.Price; 
}; 
var size = function (data) { 
    this.Id = data.Id; 
    this.Name = data.Name; 
    this.Price = data.Price; 
}; 

C# Đối tượng:

public class Pizza 
{ 
    public Guid Id { get; set; } 
    public Guid SizeId { get; set; } 
    public Size Size { get; set; } 
    public IEnumerable<Topping> Toppings { get; set; } 
} 
public class Size 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public double Price { get; set; } 
} 
public class Topping 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public double Price { get; set; } 
} 

JSON Fiddler bài Capture:

enter image description here enter image description here

Trả lời

9

ASP.NET Web API, theo mặc định, liên kết với yêu cầu cơ thể để một loại phức tạp (Pizza, trong trường hợp của bạn). API web liên kết toàn bộ phần thân toàn bộ đến một tham số. Các kiểu đơn giản như GUID bị ràng buộc từ đường dẫn URI và chuỗi truy vấn. Vì vậy, bằng cách chuyển GUID trong URI và chỉ đăng JSON tương ứng với đối tượng pizza (chỉ bánh pizza và không phải bất kỳ thứ gì khác như ID đơn đặt hàng), bạn có thể làm việc này.

+0

Vì vậy, về cơ bản, web.api không phải dành cho tôi. Tôi có phương pháp mà tôi cần phải vượt qua nhiều đối tượng. Ví dụ: đối tượng Pizza, Đơn đặt hàng và Kích thước. Và tôi đã cố gắng vượt qua Guid trong đường dẫn URI và Pizza trong Dữ liệu, và nó đã làm cho nó đến bộ điều khiển của tôi nhưng đối tượng Pizza đã trống rỗng. – Boone

+0

Không, API web dành cho mọi người. Tôi chắc chắn rằng nhu cầu của bạn có thể được đáp ứng. Bạn chỉ cần hiểu các quy tắc và chơi bởi chúng! Bạn đang đăng dữ liệu ': ko.toJSON ({pizza: pizza})'? Nếu vậy, bạn nên thử 'data: ko.toJSON (pizza)'. – Badri

+0

Tôi đang làm dữ liệu: ko.toJSON (pizza). Tôi đã dành 3 giây và chỉ sử dụng một bộ điều khiển thông thường với cùng một mã và nó hoạt động hoàn hảo. Tôi luôn cảm thấy mình phải giải quyết các vấn đề để làm việc đó. – Boone

1

Theo kinh nghiệm của tôi WEB API 2 HttpPost không không việc nếu tôi cố gắng đặt một Guid trong bộ sưu tập tham số. Tôi phải đặt Guid vào URI, ví dụ:

var url = window.applicationBaseUrl + "aiapps/" 
      + GuidOrderId + "/DeleteByGroupId"; 

Và sau đó ApiController như thế này

[HttpPost] 
    [Route("~/aiapps/{guid:Guid}/deletebygroupid")] 
    public AiAppsOpResult DeleteByGroupId(Guid guid) 
    {   

Một số người cho rằng nó sẽ làm việc sử dụng một đối tượng JSON cho Guid rằng có một mã khóa sản phẩm nào, ví dụ {'':OrderId} nhưng không phải cho tôi. Và nó không tốt để khai báo các tham số Guid tùy chọn hoặc nullable trong bộ điều khiển. Tôi chưa thử nghiệm giải pháp @ Badri, nhưng tôi nghĩ nó sẽ hoạt động. Tôi biết API WEB sẽ hoạt động nếu tôi tạo C# DTO chứa cả Pizza và OrderIdGuid và POST, ví dụ:

public class MetaPizza 
    { 
     public Pizza pizza {get;set;} 
     public Guid OrderId{get;set;} 
    } 

[Route("~/api/postorder")] 
    [HttpPost] 
    public AiAppsOpResult CalcRisk(MetaPizza metaPizza) 



$.ajax({ 
     type: "POST", 
     dataType: "json", 
     contentType: "application/json", 
     url: window.applicationBaseUrl + "api/postorder" , 
     data: _JSON_MetaPizza 
    }) 
Các vấn đề liên quan