Web API不在PUT中读取主体

时间:2016-10-27 14:02:30

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

我正在尝试通过Web API将List发送到我的控制器。我通过邮递员将其作为JSON发送。我100%确定JSON格式正确。 usersList仍然null结束。我也试过没有[FromBody]属性。

控制器名称为UserController,因此网址为api/user/。使用的方法是Put

public IHttpActionResult Put([FromBody]List<UserVm> usersList)
{
    if (usersList.Count > 0)
    {
        _userService.UpdateUserRoles(usersList);
        return Ok();
    }
    return BadRequest();
}

public class UserVm
{
    public int Id { get; set; }
    public string UserName { get; set; }
    public string Name { get; set; }
    public string Token { get; set; }
    public string Icao { get; set; }
    public string RefreshToken { get; set; }    
    public int ExpiresIn { get; set; }
    public List<Role> Roles { get; set; }
}

[
    {
        "id": 0,
        "username": "banji",
        "name": "baji",
        "token": "bajz",
        "icao": "poffe",
        "refreshtoken": "konna",
        "expiresin": 0,
        "roles": [{
            "id": 0,
            "department": "asd",
            "isadmin": false
        }]
    },
    {
        "id": 0,
        "username": "banji",
        "name": "baji",
        "token": "bajz",
        "icao": "poffe",
        "refreshtoken": "konna",
        "expiresin": 0,
        "roles": [{
            "id": 0,
            "department": "asd",
            "isadmin": false
        }]
    }
]

非常感谢有关我做错事的建议。

2 个答案:

答案 0 :(得分:3)

我刚刚复制了您发布的内容并在此处尝试过。它工作正常。

enter image description here

代码:

entryComponents

邮递员数据看起来与您发布的相同:

enter image description here

你有默认的api路线吗?像:

public class UserVm
{
    public int Id { get; set; }
    public string UserName { get; set; }
    public string Name { get; set; }
    public string Token { get; set; }
    public string Icao { get; set; }
    public string RefreshToken { get; set; }
    public int ExpiresIn { get; set; }
    public List<Role> Roles { get; set; }
}

public class Role
{
    public int Id { get; set; }
    public string Department { get; set; }
    public bool IsAdmin { get; set; }
}

public class UserController : ApiController
{
    public IHttpActionResult Put([FromBody]List<UserVm> usersList)
    {
        if (usersList.Count > 0)
        {
            //_userService.UpdateUserRoles(usersList);
            return Ok();
        }
        return BadRequest();
    }
}

PS:使用put时使用/ resource / id是一个很好的做法。您说要使用给定的ID更改资源,或者您要创建具有该ID的资源。动词PUT是幂等的,所以它应该总是具有完全相同的回报。这就是为什么它更多地用于创建资源的更新。

答案 1 :(得分:0)

我找到了解决问题的方法。我忘记了一个无参数构造函数..