Post FromBody始终无效

时间:2017-02-16 15:05:57

标签: c# asp.net-core http-post

我有一个新的API,我正在使用ASP.NET Core构建,我无法将任何数据POST到端点。

这是端点的样子:

[HttpPost]
[Route("StudentResults")]
public async Task<IActionResult> GetStudentResults([FromBody]List<string> userSocs, [FromBody]int collegeId)
{
    var college = await _collegeService.GetCollegeByID(collegeId);
    // var occupations = await _laborMarketService.GetOccupationProgramsBySocsAndCollege(userSocs, college);
    return Ok();
}

这就是我通过Postman发送的有效载荷的样子:

{
    "userSocs": [
            "291123",
            "291171",
            "312021",
            "291071",
            "152031",
            "533011"
        ],
    "collegeId": 1
}

我确保我将邮递员设置为POST Content-Type application/json。我究竟做错了什么?

7 个答案:

答案 0 :(得分:37)

总是null因为你需要将所有的post变量封装在一个对象中。像这样:

public class MyPostModel {
    public List<string> userSocs {get; set;}
    public int collegeId {get; set;}
}

然后

public async Task<IActionResult> GetStudentResults([FromBody] MyPostModel postModel)

答案 1 :(得分:6)

模型绑定失败的另一个原因(总是为null)是属性的数据类型不匹配。例如,这是一个简单的模型:

public class MyService {
    public string JobId { get; set; }
    public int ServiceType {get; set;}
}

这是一些不匹配的json:

{"JobId":1, "ServiceType":1}

当我使用jquery的.data函数检索JobId时遇到了这个问题,它会自动将其转换为int。通过改用.attr函数来修复它。

答案 2 :(得分:4)

如果模型为空,请检查:

1)数据发送到的位置:主体,形式?,并在此基础上将装饰器添加到动作中。例如:

[HttpPost]
public JsonResult SaveX([FromBody]MyVM vm) { ... }

2)检查ModelState :如果无效,则不会绑定虚拟机,因此该虚拟机为空。

if (ModelState.IsValid) { ... }

答案 3 :(得分:2)

还要确保将参数类中的那些变量声明为公共,(否则它们将一直返回为null)。

答案 4 :(得分:1)

我知道这与你的情况无关,我仍然在这里发布我的答案。我在代码中犯了一个愚蠢的错误。我刚刚复制了我的一个Get请求并将其更改为Post请求,并忘记用[FromBody]修饰参数。如果其他人遇到同样的问题,请确保您使用[FromBody]修改参数。

[HttpPost]
public IApiResponse Update([FromBody] User user) {
 if (user == null) return new ApiBadRequestResponse(ModelState);
 return _userService.Post(user) ? new ApiOkResponse(user) : new ApiResponse(500);
}

答案 5 :(得分:1)

如果您要发送两个或更多模型,则应使用此示例,这对我来说很好,祝您好运

    [HttpPost]
    public async Task<ActionResult> addUsuario([FromBody] Newtonsoft.Json.Linq.JObject datos)
    {
        Usuarios user = datos["usuario"].ToObject<Usuarios>();
        Empresas empresa = datos["empresa"].ToObject<Empresas>();
       return  Json(await _srv.addUsuario(user, empresa));
    }

答案 6 :(得分:0)

假设 [FromBody] 类由原始数据类型组成;

  1. [FromBody] 是公开的
  2. [FromBody] 有一个空的构造函数 ()
  3. [FromBody] 是可序列化的。