为什么模型验证不起作用

时间:2016-11-15 22:22:00

标签: validation asp.net-web-api asp.net-core-mvc

我有以下在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);
}

在阳光明媚的日子,这就是我所看到的。好的

enter image description here

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

鉴于在第二个例子中,没有提供必填字段,不应该返回BadRequest而不是带有无效id guid 200的00000000-0000-0000-0000-000000000000?

1 个答案:

答案 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-apidecimal属性存在类似问题的示例。

要理解的关键区别是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