【问题标题】:asp.net core 2.0 model validation not validating dataasp.net core 2.0 模型验证不验证数据
【发布时间】:2019-09-09 16:05:32
【问题描述】:

我正在使用 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总是正确的。我错过了什么?

【问题讨论】:

  • 您需要将Id设置为可为空,否则即使客户端未在请求中发送Id,该值也会默认为0。
  • 我已经完全复制了您的代码,但无法重现您的问题。但是需要注意的一点是:Required 检查一个值是否不是null、一个空字符串或空格。在您的情况下,Id 是不可为空的 int,因此它始终会提供一个值。
  • 好吧,我得到了 required 的情况,因为它应该可以为空才能工作。但是 Range 属性呢,为什么它不起作用?
  • @AliShahzad,对我来说也一样,Range 按预期工作 - 当Id 超出范围或未提供(默认为零)时,我得到一个400 BadRequest POST /api/values/ abc HTTP/1.1 主机:localhost:61154 内容类型:application/json 缓存控制:无缓存 Postman-Token:62024574-776a-4e1b-93b7-6a7bb78ecfca {“Id”:1 } 400 Bad Request {“Id” :["无效 ID"]}
  • @ironstone13 但它对我不起作用,我想我错过了一些东西

标签: c# asp.net-core model-validation


【解决方案1】:

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

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

【讨论】:

  • 感谢@Collin 解决了我们遇到的类似问题。
【解决方案2】:

我使用了您在模型中定义的相同模型属性并面临同样的问题。我对属性进行了一项更改,并在属性上定义了 DataMember 属性,例如:

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

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

【讨论】:

    【解决方案3】:

    我也解决了这个问题,对我来说有帮助的是在 ConfigureServices 中添加这个:

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

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

    【讨论】:

    • AllowValidatingTopLevelNodes 在 2.2 中已过时,在 3.1 中找不到。知道如何在 3.1 中使用它吗?
    • 根据github.com/dotnet/AspNetCore.Docs/issues/…,在使用任何提到的服务时,默认情况下会启用顶级节点的验证。
    猜你喜欢
    • 2017-12-14
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    相关资源
    最近更新 更多