.NET Core 2.2必需属性,当对象不为null时。复杂嵌套模型

问题描述 投票:4回答:1

在.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

在.NET Core 2.2中,列表中的第一个主页无效。它在.NET Core 2.1中运行

我希望仅在地址不是null时验证[Required]属性。因此,家庭可以拥有街道地址或根本没有地址。

这在.NET Core 2.2中是否可以实现?

注意:更新了重现错误的示例。似乎包含IFormFile会导致Address Class初始化自己。

{
    "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"
}

我前段时间也为此开了一个问题:https://github.com/aspnet/AspNetCore/issues/9321,如果有人想跟进的话。

c# validation asp.net-core asp.net-core-webapi model-binding
1个回答
0
投票

您想要的行为是空引用属性的行为,并且在ASP.NET Core 2.2中没有更改。仅当引用本身为非null时,才会验证引用类的属性。如果这不适合你,那么唯一的结论是这个引用属性确实有一个值。它可能只是一个默认的实例化(即new Foo()),没有实际定义的子属性,但这足以触发验证。

首先,确保您没有为属性设置默认值,或者通过构造函数为其提供默认值,例如。换句话说,如果你有类似的东西:

public Bar Bar { get; set; } = new Bar();

要么,

public Foo()
{
    Bar = new Bar();
}

删除它。

此外,要意识到如果为该参考属性发布了任何内容,那么一切都会发挥作用。即使你只是有一些隐藏的属性,如:

<input type="hidden" asp-for="Bar.Id" />

如果引用任何一个属性,即使它本身无效,该类的所有验证都将发挥作用。

© www.soinside.com 2019 - 2024. All rights reserved.