Asp.net

如何創建自定義數據註釋驗證器

  • August 5, 2010

想要創建自定義數據註釋驗證。有沒有關於如何創建它們的有用指南/範例?

首先:

具有最小和最大長度的 StringLength。我知道 .NET 4 可以做到這一點,但想在 .NET 3.5 中做同樣的事情,如果可能的話,只能定義最小長度(至少 x 個字元)、最大長度(最多 x 個字元),或者兩者兼而有之(在 x 和 y 字元之間)。

其次:

使用模數算法進行驗證 - 如果數字是有效長度,我希望使用 Modulus 11 算法進行驗證(我已經在 JavaScript 中實現了它,所以我想這只是一個簡單的移植?)

更新:

解決了第二個問題,只是複制 JavaScript 實現並進行一些調整的情況,所以不需要解決方案。

要創建自定義數據註釋驗證器,請遵循以下準則:

  1. 你的類必須繼承自System.ComponentModel.DataAnnotations.ValidationAttribute類。
  2. 覆蓋bool IsValid(object value)方法並在其中實現驗證邏輯。

而已。

重要注意事項

有時開發人員會檢查該值是否為空/空並返回 false。這通常是不正確的行為,因為這是在Required驗證器上檢查,這意味著您的自定義驗證器應該只驗證非空數據,true否則返回(參見範例)。這將使它們可用於必填(必填)和非必填欄位。

例子

public class StringLengthRangeAttribute : ValidationAttribute
{
   public int Minimum { get; set; }
   public int Maximum { get; set; }

   public StringLengthRangeAttribute()
   {
       this.Minimum = 0;
       this.Maximum = int.MaxValue;
   }

   public override bool IsValid(object value)
   {
       string strValue = value as string;
       if (!string.IsNullOrEmpty(strValue))
       {
           int len = strValue.Length;
           return len >= this.Minimum && len <= this.Maximum;
       }
       return true;
   }
}

所有屬性都可以根據您的需要在屬性中設置。

一些例子:

[Required]
[StringLengthRange(Minimum = 10, ErrorMessage = "Must be >10 characters.")]

[StringLengthRange(Maximum = 20)]

[Required]
[StringLengthRange(Minimum = 10, Maximum = 20)]

當一個特定的屬性沒有被設置時,它的值是在建構子中設置的,所以它總是有一個值。在上面的使用範例中,我還特意添加了驗證器,因此它與我寫Required的上述警告一致。

重要的

所以這個驗證器仍然可以處理你不需要的模型值,但是當它存在時它會驗證(想想網路表單中的文本欄位,這不是必需的,但如果使用者輸入一個值,它必須是有效的) .

引用自:https://stackoverflow.com/questions/3413715