2013-08-27 6 views
5

私のajax呼び出しでweb.apiメソッドに問題が発生しました。私がapiとjsの両方からGuidのorderIdを削除した場合、呼び出しによってコントローラに送られますが、ピザオブジェクトは空です。 URLにGuidを渡すと、コントローラーにも渡されますが、ピザはありません。なぜこれがうまくいかないか、あるいは私がそれを働かせるように助けてください。Web Api呼び出しが、GUIDをパラメータとして渡して404エラーを返しています

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オブジェクト:

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#のオブジェクト:

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フィドラーポストキャプチャ:

enter image description here ​​

答えて

9

ASP.NETのWeb API、デフォルトでは、複合型(あなたのケースではピザ、)に体を要求バインドします。 Web APIは、本文全体を〜というパラメータでボディにバインドします。 GUIDなどの単純な型は、URIパスとクエリ文字列からバインドされます。したがって、URIにGUIDを渡し、ピザオブジェクトに対応するJSONのみを(ピザのみで、注文IDなどの何もない)投稿することで、この作業を行うことができます。私の経験で

+0

だから、基本的に、web.apiは私のためではありません。私は複数のオブジェクトを渡す必要があるメソッドを持っています。たとえば、Pizza、Order、およびSizeオブジェクトです。そして、私はGUIDをURIパスとデータのピザに渡してみましたが、それは私のコントローラーには渡しましたが、ピザオブジェクトは空でした。 – Boone

+0

いいえ、Web APIはすべてのもの用です。私はあなたのニーズが満たされると確信しています。あなたはルールを理解し、それらによってプレイする必要があります!あなたは 'data:ko.toJSON({pizza:pizza})'を投稿していますか?もしそうなら、あなたは 'data:ko.toJSON(ピザ)'を試してみるべきです。 – Badri

+0

私はデータをやっている:ko.toJSON(ピザ)。私は3秒を費やして、同じコードで普通のコントローラーだけを使用し、それは完全に機能しました。私はちょうどそれが働くために回避策を講じなければならないように常に感じます。 – Boone

1

WEB APIの2 HttpPost私はパラメータコレクションにGuidを入れしようとした場合ない作業を行います。私はGuidをURIに入れなければなりません。

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

そしてこの

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

ようApiControllerは、いくつかは、それは例えば、空のキーを持っているGuidためにJSONオブジェクトを使用するように動作することを示唆しています{'':OrderId}しかし私のためではありません。また、コントローラでGuidパラメータをオプションまたはnullableとして宣言するのは良いことではありません。 @ Badriのソリューションはテストしていませんが、うまくいくと思います。ピザとOrderIdGuidとPOSTの両方を含むC#DTOを作成すると、WEB APIが動作することがわかります。

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 
    }) 
関連する問題