Asp.net web api 无法使用jquery ajax在asp.net核心api中发布复杂对象

Asp.net web api 无法使用jquery ajax在asp.net核心api中发布复杂对象,asp.net-web-api,asp.net-core-2.0,Asp.net Web Api,Asp.net Core 2.0,无法使用jquery ajax将具有列表的复杂对象发布到asp.net核心api 这是模型 public class Bus { public int BusId { get; set; } public string RegistrationNo { get; set; } public IEnumerable<BusSeat> BusSeats { get; set; } } public c

无法使用jquery ajax将具有列表的复杂对象发布到asp.net核心api

这是模型

public class Bus
{    
    public int BusId { get; set; }                
    public string RegistrationNo { get; set; }           
    public IEnumerable<BusSeat> BusSeats { get; set; }
}

public class BusSeat : CoreModel
{        

    public int DecNumber { get; set; }
    public int SeatId { get; set; }        
}
下面是javascript

var d = {
            BusId: 1,
            RegistrationNo: 'REG123',
            BusSeats: [
                {
                    DecNumber: 1,
                    SeatId:2,
                },
                {
                    DecNumber: 1,
                    SeatId: 4,
                }
            ]
        }

$.ajax({
            type: 'post',
            url: 'http://localhost:46060/api/bus/save',
            contentType: 'application/json; charset=utf-8',                
            dataType: 'json',
            data: JSON.stringify({ bus: d }),                
            success: function (data) {                   
            },
            error: function (data) {
            }
        });

请求成功,但我无法获取任何数据。我遗漏了什么?

将操作中的From部分更改为[FromBody],并在ajax调用中调用数据,只需说

data: JSON.stringify(d)
而不是

data: JSON.stringify({ bus: d })

将操作中的From部分更改为[FromBody],并在ajax调用中更改数据,只需说

data: JSON.stringify(d)
而不是

data: JSON.stringify({ bus: d })

在ajax调用中不需要
stringify
contentType
,在mvc操作中也不需要
[FromForm]

只需将复杂对象直接传递给数据参数

$.ajax({
    type: 'post',
    url: 'http://localhost:46060/api/bus/save',                
    dataType: 'json',
    data: d,                
    success: function (response) {                  
    },
    error: function (response) {
    }
});
只要复杂的json对象与您定义的视图模型匹配,绑定就会“神奇地”工作

[HttpPost]
public IActionResult Save(Bus bus)
{
    return Ok(bus);
}
这是离题的,但您应该考虑如何构造URI,因为您正在构建web api。您不希望在uri上仍然使用良好的旧
RPC
样式

将控制器名称视为资源集合,并使用
HttpMethod
作为动词

因此,我将创建
busecontroller
而不是
BusController
(或者使用
[RoutePrefix(“api/bus”)]
),因为我将资源视为一个集合总线

[Route("api/[controller]")]
public class BusesController : Controller
{
    // GET api/buses
    [HttpGet]
    public IActionResult()
    {
        // Return all buses
        return OK(...);
    }

    // GET api/buses/1
    [HttpGet]
    public IActionResult(int id)
    {
        // Return individual bus
        return OK(...);
    }

    // POST api/buses
    [HttpPost]
    public IActionResult Post(CreateBusViewModel model)
    {
        // Create a new bus and return newly created uri of the bus
        return Created(...);
    }
}

你可以在这里了解更多

在ajax调用中不需要
stringify
contentType
,在mvc操作中也不需要
[FromForm]

只需将复杂对象直接传递给数据参数

$.ajax({
    type: 'post',
    url: 'http://localhost:46060/api/bus/save',                
    dataType: 'json',
    data: d,                
    success: function (response) {                  
    },
    error: function (response) {
    }
});
只要复杂的json对象与您定义的视图模型匹配,绑定就会“神奇地”工作

[HttpPost]
public IActionResult Save(Bus bus)
{
    return Ok(bus);
}
这是离题的,但您应该考虑如何构造URI,因为您正在构建web api。您不希望在uri上仍然使用良好的旧
RPC
样式

将控制器名称视为资源集合,并使用
HttpMethod
作为动词

因此,我将创建
busecontroller
而不是
BusController
(或者使用
[RoutePrefix(“api/bus”)]
),因为我将资源视为一个集合总线

[Route("api/[controller]")]
public class BusesController : Controller
{
    // GET api/buses
    [HttpGet]
    public IActionResult()
    {
        // Return all buses
        return OK(...);
    }

    // GET api/buses/1
    [HttpGet]
    public IActionResult(int id)
    {
        // Return individual bus
        return OK(...);
    }

    // POST api/buses
    [HttpPost]
    public IActionResult Post(CreateBusViewModel model)
    {
        // Create a new bus and return newly created uri of the bus
        return Created(...);
    }
}

你可以在这里了解更多

我改变了答案,并在当地的一个项目中进行了检查。一切都绑定正确。原因是AspNetCore模型绑定是如何工作的。在任何情况下,它都不同于经典的AspNet。我更改了答案,并在本地项目中进行了检查。一切都绑定正确。原因是AspNetCore模型绑定是如何工作的。无论如何,它都不同于经典的AspNet。