C# 或者需要验证

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。换句话说,您可以输入其中一个,或另一个,或两者都输入,但不能将它们都保留为空 我希望这种方法既适用于服务器端验证,也适用于不引人

我想使用ComponentModelDataAnnotations验证两个属性中至少有一个具有值。我的模型如下所示:

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.")]