2013-08-27 7 views
5

Sto riscontrando problemi con la mia chiamata ajax che lo ha generato nel mio metodo web.api. Se rimuovo il orderId Guid sia da api che da js, la chiamata arriva al controller, ma l'oggetto pizza è vuoto. Se passo il Guid nell'URL, lo faccio anche al controller ma senza pizza. Spiega perché questo non funziona o aiutami a farlo funzionare.La chiamata Web Api restituisce un errore 404 con GUID passato come parametro

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:

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

JS oggetti:

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# oggetti:

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 post acquisizione:

enter image description here enter image description here

risposta

9

ASP.NET Web API, per impostazione predefinita, si lega richiesta corpo ad un tipo complesso (pizza, nel tuo caso). API Web associa il corpo nella sua interezza a un parametro. Tipi semplici come GUID sono vincolati dal percorso URI e dalla stringa di query. Quindi, passando GUID nell'URI e postando solo il JSON corrispondente all'oggetto pizza (solo la pizza e non altro come ID ordine), puoi farlo funzionare.

+0

Quindi, fondamentalmente, web.api non è per me. Ho metodi in cui ho bisogno di passare più oggetti. Ad esempio oggetti Pizza, Ordine e Dimensione. E ho provato a passare il Guid nel percorso URI e la Pizza nei dati, e lo ha fatto al mio controller ma l'oggetto Pizza era vuoto. – Boone

+0

No, l'API Web è per tutti. Sono sicuro che i tuoi bisogni possano essere soddisfatti. Hai solo bisogno di capire le regole e giocare da loro! Stai postando 'data: ko.toJSON ({pizza: pizza})'? Se è così, dovresti provare 'data: ko.toJSON (pizza)'. – Badri

+0

Sto facendo i dati: ko.toJSON (pizza). Ho impiegato 3 secondi e ho usato solo un controller regolare con lo stesso codice e ha funzionato perfettamente. Mi sento sempre come se dovessi fare i workaround solo per farlo funzionare. – Boone

1

Nella mia esperienza il WEB API 2 HttpPost fa non lavoro se provo a mettere un Guid nella raccolta dei parametri. Devo inserire l'Guid nell'URI, ad es.

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

E poi l'ApiController simili

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

Alcuni hanno suggerito che funzionerà utilizzare un oggetto JSON per la Guid che ha una chiave vuota, ad esempio {'':OrderId} ma non per me. E non fa bene dichiarare il parametro Guid opzionale o nullable nel controller. Non ho provato la soluzione di Badri, ma penso che funzionerà. So che l'API WEB funzionerà se creo un DTO C# che contenga sia Pizza che OrderIdGuid e POST che, ad es.

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

e

[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 
    }) 
Problemi correlati