2012-03-05 69 views
5

我想使用ComponentModel DataAnnotations驗證兩個屬性中的至少一個是否有值。我的模型是這樣的:要麼是必需的驗證

public class FooModel { 
    public string Bar1 { get; set; } 
    public int Bar2 { get; set; } 
} 

基本上,我想,這樣無論是BAR1 BAR2需要驗證FooModel。換句話說,你可以輸入一個,或者另一個,或者兩個都輸入,但是你不能把它們都留空。

我寧願這對於服務器端和不顯眼的客戶端驗證都有效。


編輯:這可能是一個possible duplicate, as this looks similar to what I'm looking to do

+2

這是正確的自定義驗證是在這裏你的朋友。 – veblock 2012-03-05 00:31:44

+1

有一個名爲RequiredIf的自定義驗證程序可以解決您的問題。 – Joe 2012-03-05 00:49:12

+0

@JoeTuskan,你說得對,我發現[這篇博文](http://blogs.msdn.com/b/simonince/archive/2011/02/04/conditional-validation-in-asp-net-mvc -3.aspx)在你的指導下解決了我的問題。如果你想打出一個答案,所以我可以給你信貸,這很好。如果沒有,請使用我的+1。 – 2012-03-05 01:49:22

回答

4

您將需要延長ValidationAttribute類,並在乘坐IsValid的方法,如果你想抽自定義JavaScript做驗證實施IClientValidatable。像下面的東西。

[AttributeUsage(AttributeTargets.Property)] 
    public sealed class AtLeastOneOrTwoParamsHasValue : ValidationAttribute, IClientValidatable 
    { 
     protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
     { 
      var param1 = validationContext.ObjectInstance.GetType().GetProperty("Param1").GetValue(value, null); 
      //var param2 = validationContext.ObjectInstance.GetType().GetProperty("Param2").GetValue(value, null); 

      //DO Compare logic here. 

      if (!string.IsNullOrEmpty(Convert.ToString(param1))) 
      { 
       return ValidationResult.Success; 
      } 


      return new ValidationResult("Some Error"); 
     } 

     public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
     { 
      //Do custom client side validation hook up 

      yield return new ModelClientValidationRule 
      { 
       ErrorMessage = FormatErrorMessage(metadata.DisplayName), 
       ValidationType = "validParam" 
      }; 
     } 
    } 

用法:

[AtLeastOneOrTwoParamsHasValue(ErrorMessage="Atleast one param must be specified.")]