如何將MVC 3表單上的多個文本框作爲驗證對待?多個字段上的MVC表單驗證
這是一個簡單的電話號碼字段,其中一個用於區號的文本框,一個用於前綴,一個用於最後四位數字。
實際上有兩個驗證要求:
1)他們都需要。 2)它們都必須包含整數。
現在,這對於單個字段而言很簡單,但是如何使用MVC創建ASP.NET CustomValidator的等價物,以便我可以驗證所有三個字段的整體?
如何將MVC 3表單上的多個文本框作爲驗證對待?多個字段上的MVC表單驗證
這是一個簡單的電話號碼字段,其中一個用於區號的文本框,一個用於前綴,一個用於最後四位數字。
實際上有兩個驗證要求:
1)他們都需要。 2)它們都必須包含整數。
現在,這對於單個字段而言很簡單,但是如何使用MVC創建ASP.NET CustomValidator的等價物,以便我可以驗證所有三個字段的整體?
其實我最終實現定製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"
};
}
}
我必須將ValidationType更改爲「required」以使客戶端驗證有效。我發現這個答案(http://stackoverflow.com/questions/13740489/valid-values-for-modelclientvalidationrule-validationtype-string)有助於ValidationType接受的值。 – gmasselli 2016-09-27 14:54:02
您可以通過將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.");
}
}
斯科特,是使用範圍內的自定義模型綁定?如果是這樣,您可以實現一個IModelBinder,將三個文本字段的結果合併到一個電話號碼字段中,該字段可以使用驗證屬性進行修飾。下面是對如何做到這一點的例子的計算器問題:DataAnnotation Validations and Custom ModelBinder
我的評論並沒有解決您的驗證問題,但我想知道這是否是用於輸入電話號碼的最佳用戶界面。這種設計對於用戶來說不是更多的工作嗎?在文本框之間製表標籤,如果他們想要粘貼電話號碼或刪除已輸入的電話號碼,則需要做更多的工作。我原以爲單個基於正則表達式驗證的文本框會比較平常。 – 2011-05-20 17:26:24
如果我正在做決定,我會說你是對的,但由於某種原因某人決定它需要三個文本框。不要問。 :) – Scott 2011-05-20 17:30:39
哎。你可以用我引用的例子來撼動他們的觀點嗎?另外,我假定你不需要任何非美國人將他們的電話號碼輸入到這個系統中......因爲我們的格式不同。 – 2011-05-20 17:46:42