字符串字段是必需的。即使 Asp.Net Core 中没有 Required 属性?

The string field is required. even thou there is no Required attribute in Asp.Net Core?

我正在 linux(pop os) 中构建一个简单的 Asp.Net 核心应用程序。我正在使用 VueJs + Aps.Net Core 3.1.101 我正在尝试对我的应用程序进行 POST 调用,我的模型如下所示:

public class AddConfigurationContextValueApiRequest
{
    public int ContextId { get; set; }

    [Required(ErrorMessage = "Value is required to continue")]
    [StringLength(500, ErrorMessage = "Value can not be longer than 500 characters")]
    public string Value { get; set; }

    [StringLength(500, ErrorMessage = "Display name can not be longer than 500 characters")]
    public string DisplayName { get; set; } 
}

如您所见,DisplayName 字段没有 Required 属性,但是每当我从 VueJS 应用程序为该字段传递 null 值时,我都会得到 The DisplayName field is required..

我想弄清楚为什么 AspNet Core 会为此抱怨,因为这样的字段没有 Required 属性!

有人知道这是不是故意的吗?我试图删除 StringLength 属性,但它仍然触发必需的属性。

我的操作很简单:

[HttpPost(UrlPath + "addConfigurationContextValue")]
public async Task AddConfigurationContextValue([FromBody]AddConfigurationContextValueApiRequest request)
{
    using var unitOfWork = _unitOfWorkProvider.GetOrCreate();
    if (!ModelState.IsValid)
    {
        //Here it throws because ModelState is invalid
        throw new BadRequestException(ModelState.GetErrors());
    }

    //do stuff

    await unitOfWork.CommitAndCheckAsync();
}

在@devNull 的建议下,我发现在玩 Rider 时不知何故 IDE 它似乎打开了该功能!

骑手中有一个选项允许在项目级别更改该配置:

如果有人有同样的问题:右键单击项目级别,转到属性,应用程序,在那里你可以看到这个配置。

感谢@devNull 的帮助:)

我看到了同样的问题,其中 .csproj Nullable 设置导致未标记为 [Required] 的 属性 表现得好像它是。我采用了与更改 .csproj 文件中的 Nullable 设置不同的方法。

在我的例子中,它归结为数据库所需的 属性;但是模型在 POST 期间允许 null,因为这个特定的 属性 是用户的秘密。所以我一开始就避免将 string 更改为 string?

再一次,Fluent API 提供了另一种解决方案。

原版属性

[JsonIgnore]
[StringLength(15)]
public string MyProperty { get; set; }

已更新属性

[JsonIgnore]
public string? MyProperty { get; set; }

Fluent API 指令(在您的 DbContext 文件中)

protected override void OnModelCreating(ModelBuilder builder) {
  builder.Entity<MyClass>(c => {
    c.Property(p => p.MyProperty)
      .IsRequired()
      .HasMaxLength(15)
      .IsFixedLength();
  });
}

显然 .NET 6 Web API 默认添加了“可空”属性。我只需要删除它。

.csproj 文件: