.NET Core Web API 发布表单数据并出现 400 错误

.NET Core Web API posting formdata and getting 400 error

我认为问题出在空值上。我已经测试了包含

等值的有效负载
{
 name: 'My Name', 
 householdSize: '3'
}

服务器会收到请求。但是,我仍然希望允许用户不输入任何数据,但是,当这种情况发生时,服务器永远不会被命中(我有一个断点要测试)。

我正在使用带有 .NET Core Web 的 js 前端 API。

我的负载看起来像

{
 name: null, 
 householdSize: null
}

我的视图模型就是这样

public class MyViewModel
{
    [Required]
    public string Name { get; set; }

    [Required]
    public EHouseholdSize HouseholdSize { get; set; }

    public enum EHouseholdSize
    {
        One = 1,
        Two,
        Three,
        Four,
        FivePlus
    }
}

我的控制器就是这样

public async Task<IActionResult> Add([FromBody]QuestionnaireViewModel viewModel)
{
    if(!ModelState.IsValid)
    {
        return BadRequest();
    }

    // Do stuff        

    return Ok();
}

您的 ModelState 在发送 null 值时无效,因为您的视图模型的两个 属性 都具有 [Required] 属性。发送 {"name": null, "houseHoldSize": null} 等同于 `` 或 {}。 因此,不满足要求会使模型状态无效。这就是为什么它永远不会通过您的 if 块。

因此,如果您想允许发布空值或空值,则需要从 ViewModel 属性中删除 [Required] 属性。

当您使用 API 控制器(具有 [ApiController] 属性)时,将自动验证操作参数,您不需要 if ( !ModelState.IsValid ) 因为如果模型状态无效,它将永远不会被击中。 Api controller 会在它之前 return BadRequest。因此,从您的 ViewModel 属性中删除 [Required] 属性或使它们不为 null

另一件事是你的项目是否启用了可空(主要是 net 6 项目)

  <Nullable>enable</Nullable> 

您还需要使 属性 名称也可为空

 public string? Name { get; set; }

否则,即使您删除 [Required] 属性,您也会收到 BadRequest“The Name field is required.”。