要么验证,要么验证

Ben*_*esh 7 c# validation unobtrusive-validation asp.net-mvc-3

我想使用ComponentModel DataAnnotations验证两个属性中至少有一个属性值.我的模型看起来像这样:

public class FooModel {
   public string Bar1 { get; set; }
   public int Bar2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

基本上,我想验证FooModel,以便需要Bar1 Bar2.换句话说,您可以输入一个,或另一个,或两者,但您不能将它们都留空.

我希望这对于服务器端和不显眼的客户端验证都有效.


编辑:这可能是重复,因为这看起来类似于我想要做的

Ric*_*y G 6

您需要扩展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"
            };
        }
    }
Run Code Online (Sandbox Code Playgroud)

用法:

[AtLeastOneOrTwoParamsHasValue(ErrorMessage="Atleast one param must be specified.")]
Run Code Online (Sandbox Code Playgroud)