簡體   English   中英

ASP.NET 核心 Web API - 流利的驗證不是針對 Z37A6259CC0C1DAE299A78668 進行驗證

[英]ASP.NET Core Web API - Fluent Validation not validation against null datetime

在我的 ASP.NET Core-6 Web API 中,我在 Z20F35E630DAF44DBFA4ZC3F6 中有這個字段

public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }

然后我有這個流利的驗證:

RuleFor(m => m.StartDate)
    .NotEmpty().WithMessage("Start Date field is required. ERROR!")
    .NotNull().WithMessage("Start Date cannot be null");

RuleFor(m => m.EndDate)
    .NotEmpty().WithMessage("End Date field is required. ERROR!")
    .NotNull().WithMessage("End Date cannot be null");

RuleFor(m => m).Must(m => m.EndDate == default(DateTime) || m.StartDate == default(DateTime) || m.EndDate > m.StartDate)
        .WithMessage("End Date must greater than Start Date");

此驗證結束日期必須大於開始日期才能正常工作。

但我遇到的問題是,每當 StartDate 或 EndDate 是 POSTMAN 上的 null 時,如下所示:

“開始日期”:“”,“結束日期”:“”

我收到了這個錯誤:

"errors": {
    "endDate": [
        "Error converting value {null} to type 'System.DateTime'. Path 'endDate', line 4, position 15."
    ],
    "startDate": [
        "Error converting value {null} to type 'System.DateTime'. Path 'startDate', line 3, position 17."
    ]

我該如何解決這個問題?

謝謝

您需要將DateTime設為可為空的類型:

public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }

在我看來,這實際上與 FluentValidation 無關。

在 model 綁定期間,asp.net 內核將嘗試將傳入的值轉換為屬性的類型。 如果不能,那么它將產生您所看到的錯誤。 這是 asp.net 本身的一部分,發生在 asp.net 調用 FluentValidation 之前,因此我們無法攔截或自定義此過程,因為它是 model 綁定的一部分。 驗證提供程序僅由 asp.net 在此階段完成且沒有錯誤的情況下調用。

請注意,這只發生在不可為空的值類型(例如 int、datetime 等)上,因為 null 值實際上不能分配給這種類型的屬性。 如果您使屬性可以為空,則傳遞 null 值將成功,並且 FluentValidation 將有機會執行(然后您可以在 FluentValidation 級別擁有 NotNull 規則)。

所以重申這不是 FluentValidation 的行為,這是 asp.net 內核本身的一部分。 它不能關閉,完全由屬性類型的可空性控制。

希望這可以幫到你。

暫無
暫無

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

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