ASP.NET Core 2.0模型验证未对数据进行验证

8

我正在使用ASP.NET Core 2.0默认的模型验证,但似乎无法正常工作,即使数据错误,ModelState.IsValid始终为真。

[HttpPost("abc")]
public async Task<IActionResult> Abc([FromBody]AbcViewModel model)
{
    if (!ModelState.IsValid) { return BadRequest(ModelState); }
    ...
}

public class AbcViewModel
{
    [Required(ErrorMessage = "Id is required")]
    [Range(100, int.MaxValue, ErrorMessage = "Invalid Id")]
    public int Id { get; set; }

    public bool Status { get; set; }
}

当我从Angular应用程序发布数据时,值正确地映射到模型,但是如果Id为"0"或小于100,则RequiredRange验证器都不起作用,并且ModelState.IsValid始终为true。 我错过了什么?


2
你需要将Id设置为可空,否则即使客户端在请求中没有发送Id,该值也会默认为0。 - Marcus Höglund
1
我已经完全复制了你的代码,但是我无法重现你的问题。然而需要注意的一点是:Required 检查一个值不会是 null、空字符串或空格。在你的情况下,Id 是一个非空的 int,因此它总是提供一个值。 - John H
好的,我已经解决了“required”这个问题,因为它应该是可空的才能正常工作。但是“Range”属性怎么回事,为什么它不起作用? - Ali Shahzad
@ironstone13,但是它对我不起作用,我猜我错过了什么。 - Ali Shahzad
请分享能够重现您问题的项目。 - Edward
显示剩余2条评论
3个回答

11

如果您正在使用services.AddMvcCore(),那么您需要明确设置应用程序以使用数据注释执行验证:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvcCore()
         .AddDataAnnotations()
         /* etc. */;
}

谢谢@Collin,这解决了我们遇到的类似问题。 - Rob

1

我使用了您在模型中定义的相同模型属性,遇到了相同的问题。我对该属性进行了一处更改,并在属性上定义了DataMember属性,如下:

[Required(ErrorMessage = "Id is required")]
[Range(100, int.MaxValue, ErrorMessage = "Invalid Id")]
[DataMember(Name = "Id")]
public int Id { get; set; }

它正在按预期工作,验证范围值。尝试这个,希望它能解决你面临的问题。


1

我也遇到了这个问题,而在我的情况下有所帮助的是在ConfigureServices中添加以下内容:

services.AddMvc(opt=> {
    opt.AllowValidatingTopLevelNodes = true;
});

请注意结果——如果您想获得自动的BadRequest,您需要使用[ApiController] 属性。否则,您必须检查ModelState.IsValid属性。


AllowValidatingTopLevelNodes 在2.2版本中已经过时,在3.1版本中也找不到了。有什么办法可以在3.1中使用它吗? - liang
根据 https://github.com/dotnet/AspNetCore.Docs/issues/18438#issuecomment-638494816 的说明,当使用任何提到的服务时,默认情况下启用顶级节点的验证。 - Geralt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接