api - 与 ModelState 验证 asp.net core api 的行为不一致

标签 api asp.net-core bad-request

当 asp.net core api 验证对象以及手动添加模型错误并调用 BadRequest(ModelState) 时,我得到不一致的行为

例如,我的 Controller 中有这 2 个端点

[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"
}

使用第二个 Controller 我得到这个:

{"field":["error"]}

我是否使用了错误的方法向 ModelState 添加错误,或者这是一个已知问题?

最佳答案

你可以使用

public IActionResult Post(SomeModel model)
{
    ModelState.AddModelError("key", "message");
    return ValidationProblem(ModelState);
}

此代码产生类似的响应,仅没有 TraceId。
UPD1:对于 asp.net core 3.1,它返回 traceId

关于api - 与 ModelState 验证 asp.net core api 的行为不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55289631/

相关文章:

java - 进行 Null 检查的频率和位置

javascript - 在提交 asp.net core 2.0 之前验证表单

java - 自定义错误请求HTTP400页面Spring MVC

c# - 服务器端 Blazor 中单个 EditForm 中的多个模型验证

Django 和错误请求 (400)

HTTP 客户端错误请求 400

api - 如何使用 Instagram API 或不使用 Instagram 应用程序的任何其他可用方法编辑帖子的标题

java - Json反序列化并在启动时保存到JPA

javascript - 从客户端隐藏 API key

c# - 在 Startup.ConfigureServices 方法期间访问依赖注入(inject)对象