c# - .NET Core 2.2:仅在对象不为空时验证 [必需] 属性
问题描述
我有一个带有嵌套对象的复杂模型。我只希望我的[Required]
属性在它们所在的对象不是时得到验证null
。因此,例如,如果我有一个Home
带有Address
属性的类,则该Home.Address.Street
属性仅应[required]
为Address
is not null
。
代码
在 ASP.NET Core 中,我有一个如下所示的模型:
public class Home
{
[Required]
public int Number {get;set;}
public Address Address {get;set;} // This is not required
}
public class Address
{
[Required]
public string Street {get;set;}
public IFormFile Picture {get;set;}
}
在控制器中,我有一个如下所示的操作方法:
[HttpPost]
public string AddHomes([FromForm]List<Home> homes)
{
if(!ModelState.IsValid)
{
return BadRequest();
}
// Do some saving
return Ok();
}
表单有效负载如下所示:
homes.Index: 0
homes[0].number: 1
在 ASP.NET Core 2.2Home
中,homes
列表中的第一个被标记为无效,但它在 ASP.NET Core 2.1 中可以正常工作。
我想要的是仅在不是[Required]
时才验证该属性。所以 a可以有a或根本没有。Address
null
Home
Address
Street
Address
这在 .NET Core 2.2 中可以实现吗?
注意:我在下面包含了一个更新的示例来重现错误。似乎包含
IFormFile
导致Address
类初始化自身。
{
"errors": {
"homes[0].Address.Street": [
"The Street field is required."
]
},
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "80000009-0003-ff00-b63f-84710c7967bb"
}
如果有人想跟进,我前段时间还在 GitHub 上为此打开了一个问题:包含 IFormFile 属性会强制验证整个对象。ASP.NET 核心 2.2。
解决方案
您想要的行为是空引用属性的行为,它在 ASP.NET Core 2.2 中没有改变。仅当引用本身为非空时,才验证被引用类的属性。如果这对您不起作用,那么唯一的结论是该引用属性确实具有值。它可能只是一个默认实例化(即new Foo()
),实际上没有定义任何子属性,但这足以触发验证。
首先,确保您没有为属性设置默认值,或者通过构造函数为其提供默认值。换句话说,如果你有类似的东西:
public Bar Bar { get; set; } = new Bar();
或者,
public Foo()
{
Bar = new Bar();
}
删除它。
另外,请意识到如果为该参考属性发布了任何内容,那么一切都会发挥作用。即使您只有一些隐藏的属性,例如:
<input type="hidden" asp-for="Bar.Id" />
如果引用上的任何一个属性被发布,即使它本身是无效的,该类的所有验证都会发挥作用。
推荐阅读
- java - appium在browserstack上生成IOS测试的屏幕录像后无法播放视频
- laravel - 尝试使用 Laravel Passport 登录时出错
- php - 如何一次在所有模型上应用 Laravel SoftDeletes?
- jquery - jquery输入标签在模式弹出窗口中不起作用
- python - 快速 __getitem__ 具有所有相等值的虚拟 numpy 数组
- django - Django 没有要求 password_reset_confirm 模板
- vb.net - Visual basic (.net) 插入新记录问题
- angular - 将 @Output EventEmitter 动态添加到 Angular 组件
- python - 这组代码不断循环和循环。我可以知道如何停止循环吗?
- javascript - 如果我使用了 vm.$watch API,是否需要删除组件 destroy() 上的观察者?