2011-05-20 39 views
20

如何將MVC 3表單上的多個文本框作爲驗證對待?多個字段上的MVC表單驗證

這是一個簡單的電話號碼字段,其中一個用於區號的文本框,一個用於前綴,一個用於最後四位數字。

實際上有兩個驗證要求:

1)他們都需要。 2)它們都必須包含整數。

現在,這對於單個字段而言很簡單,但是如何使用MVC創建ASP.NET CustomValidator的等價物,以便我可以驗證所有三個字段的整體?

+2

我的評論並沒有解決您的驗證問題,但我想知道這是否是用於輸入電話號碼的最佳用戶界面。這種設計對於用戶來說不是更多的工作嗎?在文本框之間製表標籤,如果他們想要粘貼電話號碼或刪除已輸入的電話號碼,則需要做更多的工作。我原以爲單個基於正則表達式驗證的文本框會比較平常。 – 2011-05-20 17:26:24

+1

如果我正在做決定,我會說你是對的,但由於某種原因某人決定它需要三個文本框。不要問。 :) – Scott 2011-05-20 17:30:39

+0

哎。你可以用我引用的例子來撼動他們的觀點嗎?另外,我假定你不需要任何非美國人將他們的電話號碼輸入到這個系統中......因爲我們的格式不同。 – 2011-05-20 17:46:42

回答

20

其實我最終實現定製ValidationAttribute來解決這個問題,使用CompareAttribute提出的相同類型的邏輯,使您可以使用反射來評估值的其他財產。這讓我在屬性級別而不是模型級別實現這一點,也允許客戶端驗證通過非侵入式JavaScript:

public class MultiFieldRequiredAttribute : ValidationAttribute, IClientValidatable 
    { 
     private readonly string[] _fields; 

     public MultiFieldRequiredAttribute(string[] fields) 
     { 
      _fields = fields; 
     } 

     protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
     { 
      foreach (string field in _fields) 
      { 
       PropertyInfo property = validationContext.ObjectType.GetProperty(field); 
       if (property == null) 
        return new ValidationResult(string.Format("Property '{0}' is undefined.", field)); 

       var fieldValue = property.GetValue(validationContext.ObjectInstance, null); 

       if (fieldValue == null || String.IsNullOrEmpty(fieldValue.ToString())) 
        return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName)); 
      } 

      return null; 
     } 

     public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
     { 
      yield return new ModelClientValidationRule 
      { 
       ErrorMessage = this.ErrorMessage, 
       ValidationType = "multifield" 
      }; 
     } 
    } 
+0

我必須將ValidationType更改爲「required」以使客戶端驗證有效。我發現這個答案(http://stackoverflow.com/questions/13740489/valid-values-for-modelclientvalidationrule-validationtype-string)有助於ValidationType接受的值。 – gmasselli 2016-09-27 14:54:02

17

您可以通過將IValidatableObject放在模型類上並執行Validate方法來處理此問題。

它可能是這個樣子:

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
{ 
     if (String.IsNullOrEmpty(_PhonePart1) || String.IsNullOrEmpty(_PhonePart2) 
      || String.IsNullOrEmpty(_PhonePart3)) 
     { 
      yield return new ValidationResult("You must enter all " + 
        "three parts of the number."); 
     } 

} 
1

斯科特,是使用範圍內的自定義模型綁定?如果是這樣,您可以實現一個IModelBinder,將三個文本字段的結果合併到一個電話號碼字段中,該字段可以使用驗證屬性進行修飾。下面是對如何做到這一點的例子的計算器問題:DataAnnotation Validations and Custom ModelBinder