在 ASP.NET MVC 中實作條件驗證
ASP.NET MVC 中的資料註解提供了一種便捷的方式來對模型屬性執行驗證。但是,有時您可能需要實作條件驗證規則,其中欄位的有效性取決於另一個欄位的值。
範例:條件必填欄位
考慮以下場景:我們有一個包含 "IsSenior" 屬性和一個包含描述的 "Senior" 屬性的 "Person" 模型。我們希望只有當 "IsSenior" 設定為 true 時,"Senior.Description" 屬性才成為必填欄位。
資料註解方法
僅使用資料註解,這是不可能的。以下程式碼示範了此限制:
public class Person { [Required(ErrorMessage = "*")] public string Name { get; set; } public bool IsSenior { get; set; } public Senior Senior { get; set; } } public class Senior { [Required(ErrorMessage = "*")] public string Description { get; set; } }
IValidatableObject 方法
ASP.NET MVC 3 引入了更好的解決方案,用於使用 IValidatableObject 介面進行條件驗證。您的模型必須實作此介面並提供接受 ValidationContext 參數的 Validate 方法。此方法可以執行自訂驗證邏輯,如果發現任何錯誤,則傳回 ValidationResult 物件的集合。
public class Person : IValidatableObject { public string Name { get; set; } public bool IsSenior { get; set; } public Senior Senior { get; set; } public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { if (IsSenior && String.IsNullOrEmpty(Senior?.Description)) yield return new ValidationResult("必须提供描述。"); } }
透過實作 IValidatableObject 接口,我們現在可以根據 "IsSenior" 的值執行條件驗證。 "IsSenior" 為 true 時,"Senior.Description" 屬性將成為必填欄位。
改良的語法 (C# 6.0 及更高版本)
在 C# 6.0 及更高版本中,可以使用表達式主體成員來簡化 Validate 方法:
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) => IsSenior && String.IsNullOrEmpty(Senior?.Description) ? new[] { new ValidationResult("必须提供描述。") } : Enumerable.Empty<ValidationResult>();
透過以上方法,我們可以有效地實現ASP.NET MVC中的條件驗證。 注意使用了空條件運算子(?.)來安全地存取Senior.Description,避免空引用異常。
以上是如何在 ASP.NET MVC 中實作條件驗證?的詳細內容。更多資訊請關注PHP中文網其他相關文章!