“非此即彼”或“必需验证”

本文关键字:非此即彼 必需验证 验证 | 更新日期: 2023-09-27 18:26:34

我想使用ComponentModel DataAnnotations来验证两个属性中至少有一个具有值。我的模型是这样的:

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

基本上,我想验证FooModel,以便需要Bar1Bar2。换句话说,你可以输入一个、另一个或两者,但不能把它们都留空。

我更希望这既适用于服务器端验证,也适用于不引人注目的客户端验证


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

“非此即彼”或“必需验证”

如果您想使用自定义JavaScript进行验证,则需要扩展ValidationAttribute类并超越IsValid方法,并实现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.")]

这对我来说是一个简单的解决方案,只需在没有任何第三方的情况下使用.net:https://stackoverflow.com/a/69621414/6742644

像这样:

public class EditModel
{
    public string ISBN { get; set; }
    public string ISBN13 { get; set; }
   [RegularExpression("True|true", ErrorMessage = "At least one field must be given a value")]    
   public bool Any => ISBN != null || ISBN13 != null;
}

还需要知道的是,您可以向模型中的属性添加任何属性,如MinLength、MaxLength等。只是不要添加Required属性。