要么是必需的验证

问题描述:

我想使用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

您将需要延长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.")]