[英].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.