Data Annotations for validation, at least one required field?

前端 未结 4 1352
我在风中等你
我在风中等你 2020-12-03 00:52

If I have a search object with a list of fields, can I, using the System.ComponentModel.DataAnnotations namespace, set it up to validate that at least one of the fields in t

4条回答
  •  爱一瞬间的悲伤
    2020-12-03 01:38

    I have extended Zhaph answer to support grouping of properties.

    [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
    public class AtLeastOnePropertyAttribute : ValidationAttribute
    {
        private string[] PropertyList { get; set; }
    
        public AtLeastOnePropertyAttribute(params string[] propertyList)
        {
            this.PropertyList = propertyList;
        }
    
        //See http://stackoverflow.com/a/1365669
        public override object TypeId
        {
            get
            {
                return this;
            }
        }
    
        public override bool IsValid(object value)
        {
            PropertyInfo propertyInfo;
            foreach (string propertyName in PropertyList)
            {
                propertyInfo = value.GetType().GetProperty(propertyName);
    
                if (propertyInfo != null && propertyInfo.GetValue(value, null) != null)
                {
                    return true;
                }
            }
    
            return false;
        }
    }
    

    Usage:

    [AtLeastOneProperty("StringProp", "Id", "BoolProp", ErrorMessage="You must supply at least one value")]
    public class SimpleTest
    {
        public string StringProp { get; set; }
        public int? Id { get; set; }
        public bool? BoolProp { get; set; }
    }
    

    And if you want to have 2 groups (or more):

    [AtLeastOneProperty("StringProp", "Id", ErrorMessage="You must supply at least one value")]
    [AtLeastOneProperty("BoolProp", "BoolPropNew", ErrorMessage="You must supply at least one value")]
    public class SimpleTest
    {
        public string StringProp { get; set; }
        public int? Id { get; set; }
        public bool? BoolProp { get; set; }
        public bool? BoolPropNew { get; set; }
    }
    

提交回复
热议问题