【问题标题】:ASP.NET and EF Core - ModelState.IsValid always returns true for models generated by Scaffold-DbContextASP.NET 和 EF Core - 对于 Scaffold-DbContext 生成的模型,ModelState.IsValid 始终返回 true
【发布时间】:2016-12-12 02:31:07
【问题描述】:

我无法在我的 ASP.NET Core 控制器中验证由 Scaffold-DbContext 命令生成的模型。

所需/最大长度属性配置都在EF核心生成的上下文类的onModelCreating方法中。

protected override void OnModelCreating( ModelBuilder modelBuilder ) {
    modelBuilder.Entity<ModelClass>( entity => {
        entity.ToTable( "ModelClass", "schema" );

        entity.Property( e => e.ModelClassCode )
              .IsRequired()
              .HasMaxLength( 30 );

我的控制器以 JSON 格式接收模型的数据,但即使我发送无效数据,ModelState.IsValid 也始终返回 true。

public IActionResult CreateModelClass( [FromBody]ModelClass modelClass ) {
    // ModelState.IsValid always returns true here

我让 ModelState.IsValid 为 false 的唯一方法是向模型类添加数据注释。我想避免这种情况,因为运行脚手架命令会覆盖这些更改。

我在这里遗漏了什么吗?有没有人可以指出我的例子?我见过的和验证相关的都是使用数据注解的。

【问题讨论】:

  • 我相信验证框架依赖于属性上的数据注释。所以你需要它来让模态验证工作。
  • 感谢@Shyju 的回复。我希望避免模型中的数据注释,因为当我从数据库重新生成模型时它们会被覆盖。
  • 您可以尽可能使用Scaffold-DbContext来生成数据注释,而不是使用fluent api。使用以下命令行参数 -a|--data-annotations Use DataAnnotation attributes to configure the model where possible. If omitted, the output code will use only the fluent API. 这样Required/``MaxLength` 等将使用注释搭建脚手架,并为您提供验证支持。
  • 感谢@Smit 的回复。我昨天在查看 ASP.NET 核心文档时确实遇到了-DataAnnotations 开关,并且确实有效。在这一点上,我只是好奇为什么流畅的 API 方法似乎无法验证。
  • 正如@Shyju 指出的,数据验证框架依赖于注释。 Fluent API 是 EF 特有的东西。 & EF 本身不提供任何验证。

标签: validation asp.net-core-mvc entity-framework-core


【解决方案1】:

正如@Smit 的评论中提到的,您可以使用Scaffold-DbContext 命令中的--Data-Annotations 开关来生成具有正确验证注释的模型。

在此处查看Scaffold-DbContext 的文档:https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/powershell

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-07
    • 2018-05-22
    • 1970-01-01
    • 2021-01-02
    • 2018-03-06
    • 2022-06-21
    • 2021-04-09
    • 1970-01-01
    相关资源
    最近更新 更多