簡體   English   中英

.NET Core 2.2:僅當對象不為 null 時才驗證 [required] 屬性

[英].NET Core 2.2: Validate [required] properties only when object is not null

我有一個帶有嵌套對象的復雜模型。 我只希望我的[Required]屬性在它們所在的對象不為null時得到驗證。 因此,例如,如果我有一個帶有Address屬性的Home類,則Home.Address.Street屬性應該僅在Address不為null時才為[required]

代碼

在 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.2 中, homes列表中的第一個Home被標記為無效,但它在 ASP.NET Core 2.1 中的工作方式與我預期的一樣。

我想要的是僅當Address不為null時才驗證[Required]屬性。 因此,一個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 上為此打開了一個問題,如果有人想跟進: Inclusion of IFormFile property forces the whole object to be validated。 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" />

如果引用的任何一個屬性被發布,即使它本身無效,所有對類的驗證都會起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM