c# - 或需要验证

原文 标签 c# asp.net-mvc-3 validation unobtrusive-validation

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

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

基本上,我想验证foomodel,这样就需要bar1或bar2。换句话说,你可以输入一个,或者另一个,或者两者都输入,但是你不能把它们都空着。
我更希望这既适用于服务器端验证,也适用于不引人注目的客户端验证。
编辑:这可能是一个possible duplicate, as this looks similar to what I'm looking to do

最佳答案

如果您想使用自定义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.")]

相关文章:

c# - 盲人应用程序

c# - C#计时器回调在每个循环中使用函数返回的值

c# - 在开始时高效地进行插入和移除

javascript - 如何将javascript与razor代码混合

c# - 比较数字算法

asp.net-mvc-3 - MVC 3 Razor Intellisense

c# - 无法更新外键参考(导航属性)

ruby-on-rails - Rails验证嵌套属性

php - 在表单类型中使用Symfony2 UserPassword验证程序

php - Zend Framework 2表单的自定义验证器