“非此即彼”或“必需验证”
本文关键字:非此即彼 必需验证 验证 | 更新日期: 2023-09-27 18:26:34
我想使用ComponentModel DataAnnotations来验证两个属性中至少有一个具有值。我的模型是这样的:
public class FooModel {
public string Bar1 { get; set; }
public int Bar2 { get; set; }
}
基本上,我想验证FooModel,以便需要Bar1或Bar2。换句话说,你可以输入一个、另一个或两者,但不能把它们都留空。
我更希望这既适用于服务器端验证,也适用于不引人注目的客户端验证
编辑:这可能是一个重复,因为这看起来类似于我想要做的
如果您想使用自定义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属性。