api - 与 ModelState 验证 asp.net core api 的行为不一致
问题描述
当 asp.net core api 验证对象以及手动添加模型错误并调用 BadRequest(ModelState) 时,我得到不一致的行为
例如,我的控制器中有这两个端点
[HttpPost]
public IActionResult Post(MyModel model)
{
return Ok();
}
[HttpPost]
[Route("test")]
public IActionResult OtherPost()
{
ModelState.AddModelError("field", "error");
return BadRequest(ModelState);
}
MyModel 是:
public class MyModel
{
[Required]
[MinLength(10)]
public string MyProperty { get; set; }
}
当我使用空主体调用第一个端点时,我不需要验证 ModelState,因为框架会自动执行它并给出以下响应:
{
"errors":{"MyProperty":["The MyProperty field is required."]},
"title":"One or more validation errors occurred.",
"status":400,
"traceId":"80000005-0000-ff00-b63f-84710c7967bb"
}
使用第二个控制器,我得到了这个:
{"field":["error"]}
我是否使用错误的方法向 ModelState 添加错误,或者这是一个已知问题?
解决方案
- 如果您更喜欢自己验证模型状态并期望得到与绑定失败消息完全相同的结果,则
ApiController
可以如下所示:
public IActionResult Other2Post()
{
ModelState.AddModelError("field", "error");
var problemDetails = new ValidationProblemDetails(ModelState)
{
Status = StatusCodes.Status400BadRequest,
};
var traceId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
problemDetails.Extensions["traceId"] = traceId;
var result = new BadRequestObjectResult(problemDetails);
result.ContentTypes.Add("application/problem+json");
result.ContentTypes.Add("application/problem+xml");
return result;
}
- 或者,如果您不需要
traceId
,您可以简单地返回 aBadRequest
ofValidationProblemDetails
:
ModelState.AddModelError("field", "error");
var problemDetails = new ValidationProblemDetails(ModelState)
{
Status = StatusCodes.Status400BadRequest,
};
return BadRequest(problemDetails);
演示:
推荐阅读
- swiftui - 导航时如何在 SwiftUI 中使用自定义视图转换?
- react-native - useQuery: `loading`、`error` 和 `data` props 的自定义名称
- c++ - 现在是否可以使用当前的 C++ 标准草案版本为具有 const 字段而没有 UB 的类定义复制赋值运算符
- javascript - 使用卡片切换按钮动态创建布局
- python - 如何使用 Python 在不适合内存的巨大数据集上执行 LSA?
- ios - Xcode 中架构 x86_64 错误的 44 个重复符号
- r - 在 R 中分离嵌入/嵌套的数据帧
- flutter - 将字符串值从一个有状态小部件更改为另一个有状态小部件
- reactjs - React axios 文件上传失败 - 错误“多部分:未找到边界”
- typescript - Firebase 存储上传在 TypeScript 中总是有 0 个字节