Nej*_*roi 7 c# validation model-binding asp.net-core asp.net-core-webapi
我有一个带有嵌套对象的复杂模型。我只希望我的[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
}
Run Code Online (Sandbox Code Playgroud)
public class Address
{
[Required]
public string Street {get;set;}
public IFormFile Picture {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
在控制器中,我有一个如下所示的操作方法:
[HttpPost]
public string AddHomes([FromForm]List<Home> homes)
{
if(!ModelState.IsValid)
{
return BadRequest();
}
// Do some saving
return Ok();
}
Run Code Online (Sandbox Code Playgroud)
表单有效负载如下所示:
homes.Index: 0
homes[0].number: 1
Run Code Online (Sandbox Code Playgroud)
在ASP.NET 2.2的核心,首先Home
在homes
列表中被标记为无效,但它是工作,我期望在ASP.NET 2.1的核心。
我想要的是[Required]
只有在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"
}
Run Code Online (Sandbox Code Playgroud)
前段时间我也在 GitHub 上为此打开了一个问题,如果有人想跟进:包含 IFormFile 属性会强制验证整个对象。ASP.NET 核心 2.2 .
您想要的行为是空引用属性的行为,并且它在 ASP.NET Core 2.2 中没有更改。仅当引用本身非空时,才会验证引用类的属性。如果这对您不起作用,那么唯一的结论是该引用属性确实具有值。它可能只是一个默认实例化(即new Foo()
),没有实际定义任何子属性,但这足以触发验证。
首先,确保您没有为属性设置默认值,或者通过构造函数等方式为其提供默认值。换句话说,如果你有类似的东西:
public Bar Bar { get; set; } = new Bar();
Run Code Online (Sandbox Code Playgroud)
或者,
public Foo()
{
Bar = new Bar();
}
Run Code Online (Sandbox Code Playgroud)
删除它。
另外,请注意,如果为该参考属性发布了任何内容,那么一切都会发挥作用。即使您只有一些隐藏财产,例如:
<input type="hidden" asp-for="Bar.Id" />
Run Code Online (Sandbox Code Playgroud)
如果引用上的任何一个属性被发布,即使它本身无效,类上的所有验证都将发挥作用。
归档时间: |
|
查看次数: |
2598 次 |
最近记录: |