Web Api调用返回404错误,GUID作为参数传递

时间:2013-08-27 22:32:22

标签: asp.net-mvc jquery asp.net-mvc-4 asp.net-web-api

我在使用ajax调用时遇到麻烦,使其成为我的web.api方法。如果我从api和js中删除了Guid orderId,则调用将其发送给控制器,但是pizza对象为空。如果我在URL中传递Guid,它也会转到控制器但没有披萨。请解释为什么这不起作用或帮助我使其发挥作用。

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 Fiddler Post Capture:

enter image description here enter image description here

2 个答案:

答案 0 :(得分:9)

默认情况下,ASP.NET Web API将请求主体绑定到复杂类型(在您的情况下为Pizza)。 Web API将主体整体绑定到一个参数。诸如GUID的简单类型从URI路径和查询字符串绑定。因此,通过在URI中传递GUID并仅发布与披萨对象相对应的JSON(仅披萨而不是订单ID等其他任何东西),您可以使其正常工作。

答案 1 :(得分:1)

根据我的经验,如果我尝试在参数集合中放置Guid,那么WEB API 2 HttpPost会 而不是 工作。我必须将Guid放入URI,例如

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

然后像这样的ApiController

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

有人建议使用具有空键的Guid的JSON对象,例如: {'':OrderId}但不适合我。并且在控制器中声明Guid参数可选或可为空是没有用的。 我没有测试@ Badri的解决方案,但我认为它会起作用。我知道如果我制作一个包含Pizza和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
    })