字符串字段是必需的。即使 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 文件:
我正在 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 文件: