gpt4 book ai didi

validation - 为什么模型验证不起作用

转载 作者:行者123 更新时间:2023-12-05 03:10:13 26 4
gpt4 key购买 nike

我有以下在 Web API 发布期间使用的模型类。如您所见,Id 字段被注释为 Required。

public class Model
{
[Required]
public Guid Id { get; set; }
}

API的帖子如下

[HttpPost]
public IActionResult Post([FromBody]Model value)
{
if (!ModelState.IsValid)
return BadRequest();

Model newModel = new Model() { Id = value.Id };
return Ok(newModel);
}

在晴天,这是我看到的。一切顺利

enter image description here

在下雨天,当没有提供 Id 时,我得到了关注。 enter image description here

鉴于在第二个示例中,未提供必填字段,难道不应该返回 BadRequest 而不是带有无效 ID GUID 00000000-0000-0000-0000-000000000000 的 200?

最佳答案

使用 Required 注释

在 Web API 文档中,您的问题被称为“发布不足”。

问题是 Guid 有一个默认值,所以当没有提供值时,它会用默认值初始化...然后满足 Required 约束.

为了防止这种情况发生,您使用 Guid? 使 Guid 可以为空。

然后,如果未提供值,反序列化器会将值设置为 null,这将导致违反 Required 约束。

如果提供了这个值,它就会被设置,一切都会好起来的。

参见 https://www.asp.net/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-api有关更多详细信息,请参阅 decimal 属性的类似问题示例。

要理解的关键区别是 Guid.Empty 确实是一个有效的 Guid。区分用户提供 Guid(为空)和根本不提供 Guid 的唯一方法是使其可为空,因此 null = 未提供,Empty = 用户提供了空 Guid。

使用自定义注解

如果你真的不想让你的 Guid 可以为空,你需要考虑你会为“正常”值类型做些什么,例如一个整数。您可以使用 Range 属性并指定它必须为 > 0,而不是将其设为必需。

与 Guid 类似,理想情况下,您最好有一个属性来简单地测试它是 != Guid.Empty

参见 https://learn.microsoft.com/en-us/aspnet/core/mvc/models/validation#custom-validation有关创建自定义验证属性的指导。

关于validation - 为什么模型验证不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40620781/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com