让IDataErrorInfo和ValidationAttribute结合实现基础验证

本文介绍如何在WinForm中利用System.ComponentModel.DataAnnotations命名空间中的ValidationAttribute及IDataErrorInfo接口实现数据验证功能。通过一个抽象基类EntityBase的示例代码,展示了如何收集属性上的验证特性并在运行时进行有效性检查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家都知道微软在Asp.net Mvc中引入System.ComponentModel.DataAnnotations 命名空间,利用ValidationAttribute实现数据的校验,那么能不能把这种机制引入WinForm中呢?通过近两天的尝试发现,winform中很多组件都支持IDataErrorInfo接口实现的校验提示,我便想,如果让我们的这些校验特性的错误提示转到IDataErrorInfo接口实现中不久成功了吗?

下面就来尝试一下:

隐藏行号 复制代码 这是一段程序代码。
  1. public abstract class EntityBase : INotifyPropertyChanged, IDataErrorInfo
    
  2.     {
    
  3.         private readonly Dictionary<string, PropertyInfo> _propertyGetters=new Dictionary<string, PropertyInfo>();
    
  4.         private readonly Dictionary<string, ValidationAttribute[]> _validators=new Dictionary<string, ValidationAttribute[]>();
    
  5.         private readonly Type _type;
    
  6.         protected EntityBase()
    
  7.         {
    
  8.             _type = GetType();
    
  9.             LoadData();
    
  10.         }
    
  11.         #region 私?有D方?法¨
    
  12.         private void LoadData()
    
  13.         {
    
  14.             PropertyInfo[] properties = _type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
    
  15.             foreach (PropertyInfo propertyInfo in properties)
    
  16.             {
    
  17.                 //拥μ有D的?验é证¤特?性?
    
  18.                 object[] customAttributes = propertyInfo.GetCustomAttributes(typeof(ValidationAttribute), true);
    
  19.                 if (customAttributes.Length > 0)
    
  20.                 {
    
  21.                     _validators.Add(propertyInfo.Name, customAttributes as ValidationAttribute[]);
    
  22.                     _propertyGetters.Add(propertyInfo.Name, propertyInfo);
    
  23.                 }
    
  24.             }
    
  25.         }
    
  26.         /// 
    
  27.         /// 属?性?更ü改?通¨知a
    
  28.         /// 
    
  29.         /// 
    
  30.         private void OnPropertyChanged(string propertyName)
    
  31.         {
    
  32.             if (PropertyChanged != null)
    
  33.             {
    
  34.                 PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    
  35.             }
    
  36.         }
    
  37.         #endregion
    
  38. 
    
  39.         #region IDataErrorInfo Members
    
  40.         /// 
    
  41.         /// 实μ现?IDataErrorInfo接ó口ú(获?取?校£验é未′通¨过y的?错í误ó提á示?)
    
  42.         /// 
    
  43.         public string Error
    
  44.         {
    
  45.             get
    
  46.             {
    
  47.                 IEnumerable<string> errors = from d in _validators
    
  48.                                              from v in d.Value
    
  49.                                              where !v.IsValid(_propertyGetters[d.Key].GetValue(this,null))
    
  50.                                              select v.ErrorMessage;
    
  51.                 return string.Join(Environment.NewLine, errors.ToArray());
    
  52.             }
    
  53.         }
    
  54.         /// 
    
  55.         /// 实μ现?IDataErrorInfo接ó口ú()
    
  56.         /// 
    
  57.         /// 
    
  58.         /// 
          
    
  59.         public string this[string columnName]
    
  60.         {
    
  61.             get
    
  62.             {
    
  63.                 if (_propertyGetters.ContainsKey(columnName))
    
  64.                 {
    
  65.                     object value = _propertyGetters[columnName].GetValue(this,null);
    
  66.                     string[] errors = _validators[columnName].Where(v => !v.IsValid(value))
    
  67.                         .Select(v => v.ErrorMessage).ToArray();
    
  68.                     OnPropertyChanged("Error");
    
  69.                     return string.Join(Environment.NewLine, errors);
    
  70.                 }
    
  71.                 OnPropertyChanged("Error");
    
  72.                 return string.Empty;
    
  73.             }
    
  74.         }
    
  75.         #endregion
    
  76. 
    
  77.         #region INotifyPropertyChanged Members
    
  78.         public event PropertyChangedEventHandler PropertyChanged;
    
  79.         #endregion
    
  80.     }
    

 

通过代码中的注释信息,应该很容易理解的

下面让我们的类继承该抽象类就可以了,下面是显示效果截图

image

短短的几十行代码,就实现了如此强大的功能,兴奋吧,当然要想让我们的框架实现更强大的验证功能,我们还可以实现自己的验证特性,这些在Asp.Net Mvc中已经司空见惯了,我就不多说了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值