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)
我看到了同样的问题,其中 .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)
显然,.NET 6 Web API 默认添加了“Nullable”属性。我只需要将其删除即可。
.csproj 文件:
编辑:正如卢克所指出的(没有进一步阐述),上述行为正在按预期工作并且实际上是有意义的。如果您的 JSON 具有空值,如果不进行处理,您的代码可能会崩溃。抛出编译时错误是不可能的,因为 JSON 是未知的。强迫自己使用可为空的引用类型可以使代码更具弹性。
我还没有检查 swagger 的行为方式,如果您省略 [Required] 属性并仅使用可空引用类型来指向,默认配置肯定不关心 .NET 6 设置,并且将不再标记必填字段找出什么是强制性的,什么不是。
在 @devNull 的建议之后,我发现不知何故,当我在使用 Rider IDE 时,它似乎打开了该功能!
骑手中有一个选项允许在项目级别更改该配置:
如果有人遇到同样的问题:右键单击项目级别,转到属性,应用程序,然后您可以看到此配置。
谢谢@devNull 的帮助:)
| 归档时间: |
|
| 查看次数: |
6278 次 |
| 最近记录: |