C# 或者需要验证
我想使用ComponentModelDataAnnotations验证两个属性中至少有一个具有值。我的模型如下所示:C# 或者需要验证,c#,asp.net-mvc-3,validation,unobtrusive-validation,C#,Asp.net Mvc 3,Validation,Unobtrusive Validation,我想使用ComponentModelDataAnnotations验证两个属性中至少有一个具有值。我的模型如下所示: public class FooModel { public string Bar1 { get; set; } public int Bar2 { get; set; } } 基本上,我想验证FooModel,以便需要Bar1或Bar2。换句话说,您可以输入其中一个,或另一个,或两者都输入,但不能将它们都保留为空 我希望这种方法既适用于服务器端验证,也适用于不引人
public class FooModel {
public string Bar1 { get; set; }
public int Bar2 { get; set; }
}
基本上,我想验证FooModel,以便需要Bar1或Bar2。换句话说,您可以输入其中一个,或另一个,或两者都输入,但不能将它们都保留为空
我希望这种方法既适用于服务器端验证,也适用于不引人注目的客户端验证。
编辑:这可能是一个您需要扩展ValidationAttribute类并超越IsValid方法,如果您想使用自定义JavaScript进行验证,则需要实现IClientValidable。像下面这样
[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"
};
}
}
没错,自定义验证器是您在这里的朋友。有一个名为RequiredIf的自定义验证器可以解决您的问题。@JoeTuskan,您说得对,我在您的指导下找到了它,它解决了我的问题。如果你想打印一个答案,这样我就可以给你评分了,我没问题。如果没有,请使用my+1.AFAIK,这应该通过使用不同的视图模型来解决,并从公共父级继承公共属性。我们需要装饰这些可选的房子吗?@KaushikThanki不,你不需要
[AtLeastOneOrTwoParamsHasValue(ErrorMessage="Atleast one param must be specified.")]