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

Raj*_*gaj 5 c# asp.net-core asp.net-core-3.1

我正在 linux(pop os) 中构建一个简单的 Asp.Net Core 应用程序。我正在使用 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; } 
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,该字段没有Required属性DisplayName,但每当我null从 VueJS 应用程序传递该字段的值时,我都会得到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();
}
Run Code Online (Sandbox Code Playgroud)

foo*_*how 5

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

就我而言,它归结为数据库所需的属性;但该模型在 POST 期间允许 null,因为此特定属性是用户的秘密。所以我避免string改为string?

Fluent API 再次提供了替代解决方案。

原有财产

[JsonIgnore]
[StringLength(15)]
public string MyProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)

更新属性

[JsonIgnore]
public string? MyProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)

Fluent API 指令(在 DbContext 文件中)

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


Hei*_*aen 5

显然,.NET 6 Web API 默认添加了“Nullable”属性。我只需要将其删除即可。

.csproj 文件:

在此输入图像描述

编辑:正如卢克所指出的(没有进一步阐述),上述行为正在按预期工作并且实际上是有意义的。如果您的 JSON 具有空值,如果不进行处理,您的代码可能会崩溃。抛出编译时错误是不可能的,因为 JSON 是未知的。强迫自己使用可为空的引用类型可以使代码更具弹性。

我还没有检查 swagger 的行为方式,如果您省略 [Required] 属性并仅使用可空引用类型来指向,默认配置肯定不关心 .NET 6 设置,并且将不再标记必填字段找出什么是强制性的,什么不是。


Raj*_*gaj 3

在 @devNull 的建议之后,我发现不知何故,当我在使用 Rider IDE 时,它似乎打开了该功能!

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

如果有人遇到同样的问题:右键单击项目级别,转到属性,应用程序,然后您可以看到此配置。

谢谢@devNull 的帮助:)

在此输入图像描述