我有以下在Web API Post期间使用的Model类。如您所见,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);
}
在阳光明媚的日子,这就是我所看到的。好的
在下雨天,当没有提供Id时,我得到了关注。 enter image description here
鉴于在第二个例子中,没有提供必填字段,不应该返回BadRequest而不是带有无效id guid 200的00000000-0000-0000-0000-000000000000?
答案 0 :(得分:4)
在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
,而不是必需。
同样对于Guids,理想情况下,你有一个属性可以简单地测试它是!= Guid.Empty
有关创建自定义验证属性的指导,请参阅https://docs.microsoft.com/en-us/aspnet/core/mvc/models/validation#custom-validation。