Web Api参数对象即使在Ajax调用中也为null

时间:2018-11-20 08:29:36

标签: json ajax asp.net-web-api

这是我的模特:

namespace API.Model
{
[Serializable]
public class OrderModel
{
    public string hashKey { get; set; }
    public int orderId { get; set; }
    public string skuId { get; set; }
    public string itemId { get; set; }
    public string prevItemId { get; set; }
    public int quantity { get; set; }
}
}

这是我的控制器

[RoutePrefix("api/orderapi")]
public class OrderAPIController : ApiController
{
    [HttpPost]
    [Route("UpdateMultipackage")]
    public IHttpActionResult UpdatePOMultipackageSKU([FromBody] OrderModel multipackageSKU)
    {
        if (!ModelState.IsValid)
        {
            var errors = ModelState
                .SelectMany(x => x.Value.Errors, (y, z) => z.Exception.Message);

            return BadRequest(errors.ToString());
        }

        MPPEWebServices.API.ResInfo results = new MPPEWebServices.API.ResInfo();
        Guid appGuid = new Guid(multipackageSKU.hashKey);
        MPPEOrderController orderController = new MPPEOrderController();

        Guid skuIdGuid = new Guid(multipackageSKU.skuId);
        Guid itemIdGuid = new Guid(multipackageSKU.itemId);
        Guid prevItemIdGuid = new Guid(multipackageSKU.prevItemId);

        if (orderController.UpdatePOMultipackageSKU(multipackageSKU.orderId, skuIdGuid, itemIdGuid, prevItemIdGuid, multipackageSKU.quantity) > 0)
        {
            results.Success = true;
            results.Message = "Success";
        }
        else
        {
            results.Success = false;
            results.Message = "Failed";
        }

        return Ok(results.ToString());
    }
}

这就是我在ajax中调用控制器的方式。

var obj =
    {
        hashKey: "5B1D386B-D725-4AD3-AF9D-2CC3FCBE7AAC",
        orderId: 1166,
        skuId: "5B1D386B-D725-4AD3-AF9D-2CC3FCBE7AAC",
        itemId: "5B1D386B-D725-4AD3-AF9D-2CC3FCBE7AAC",
        prevItemId: "5B1D386B-D725-4AD3-AF9D-2CC3FCBE7AAC",
        quantity: 1
    };

$.ajax({
            type: 'POST',
            url: '/api/orderapi/updatemultipackage',
            data: JSON.stringify(obj),
            dataType: 'json',
            contentType: 'application/json; charset=utf-8',
            success: function (result) {
                alert('Success! ' + result.responseText + " " + this.url + " " + this.data);
            },
            error: function (result) {
                alert('Error! ' + result.responseText + " " + this.url + " " + this.data);
            },
            async: true
        });

使用此代码,我将json传递给控制器​​中的对象。当我在Controller中设置断点或当我将模型放在监视中时。模型中的所有变量仍然为null。但是在我的JavaScript中,我所有的变量都有值。请有人帮我。谢谢!

1 个答案:

答案 0 :(得分:0)

您请求的主体与api方法中的预期对象不匹配。

当您将主体定义为"{multipackageSKU:" + JSON.stringify(obj) + "}"时,实际上等于C#类为

public class RequestModel
{
    public OrderModel MultipackageSKU { get; set; }
}

这就是为什么它与api方法签名不匹配的原因。

最简单的解决方案,尝试将请求正文定义为

data: JSON.stringify(obj)