要么是必需的验证
问题描述:
我想使用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
答
您将需要延长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.")]
这是正确的自定义验证是在这里你的朋友。 – veblock 2012-03-05 00:31:44
有一个名为RequiredIf的自定义验证程序可以解决您的问题。 – Joe 2012-03-05 00:49:12
@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