首頁 >後端開發 >C++ >如何在 ASP.NET MVC 中實作條件驗證?

如何在 ASP.NET MVC 中實作條件驗證?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-08 17:31:41372瀏覽

How to Implement Conditional Validation in ASP.NET MVC?

在 ASP.NET MVC 中實作條件驗證

ASP.NET MVC 中的資料註解提供了一種便捷的方式來對模型屬性執行驗證。但是,有時您可能需要實作條件驗證規則,其中欄位的有效性取決於另一個欄位的值。

範例:條件必填欄位

考慮以下場景:我們有一個包含 "IsSenior" 屬性和一個包含描述的 "Senior" 屬性的 "Person" 模型。我們希望只有當 "IsSenior" 設定為 true 時,"Senior.Description" 屬性才成為必填欄位。

資料註解方法

僅使用資料註解,這是不可能的。以下程式碼示範了此限制:

<code class="language-csharp">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; }
}</code>

IValidatableObject 方法

ASP.NET MVC 3 引入了更好的解決方案,用於使用 IValidatableObject 介面進行條件驗證。您的模型必須實作此介面並提供接受 ValidationContext 參數的 Validate 方法。此方法可以執行自訂驗證邏輯,如果發現任何錯誤,則傳回 ValidationResult 物件的集合。

<code class="language-csharp">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("必须提供描述。");
    }
}</code>

透過實作 IValidatableObject 接口,我們現在可以根據 "IsSenior" 的值執行條件驗證。 "IsSenior" 為 true 時,"Senior.Description" 屬性將成為必填欄位。

改良的語法 (C# 6.0 及更高版本)

在 C# 6.0 及更高版本中,可以使用表達式主體成員來簡化 Validate 方法:

<code class="language-csharp">public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) =>
    IsSenior && String.IsNullOrEmpty(Senior?.Description)
        ? new[] { new ValidationResult("必须提供描述。") }
        : Enumerable.Empty<ValidationResult>();</code>

透過以上方法,我們可以有效地實現ASP.NET MVC中的條件驗證。 注意使用了空條件運算子(?.)來安全地存取Senior.Description,避免空引用異常。

以上是如何在 ASP.NET MVC 中實作條件驗證?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn