.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.”。
我认为问题出在空值上。我已经测试了包含
等值的有效负载{
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.”。