本版本延续MVC中的统一验证机制~续的这篇文章,本篇主要是对验证基类的扩展和改善

1 namespace Web.Mvc.Extensions
2 {
3
4 #region 验证基类
5 /// <summary>
6 /// 通用验证基类
7 /// </summary>
8 public abstract class EntityValidationAttribute : ValidationAttribute
9 {
10 #region Constructors
11 public EntityValidationAttribute(MessageType messageId, params object[] args) :
12 base(() => MessageManager.Current.GetMessage(messageId, args)) { }
13 #endregion
14
15 #region Protected Properties
16 protected virtual Regex rLetters { get { return new Regex("[a-zA-Z]{1,}"); } }
17 /// <summary>
18 /// 验证数字
19 /// 子类可以根据自己的逻辑去重写
20 /// </summary>
21 protected virtual Regex rDigit { get { return new Regex("[0-9]{1,}"); } }
22 /// <summary>
23 /// 验证邮编
24 /// 子类可以根据自己的逻辑去重写
25 /// </summary>
26 protected virtual Regex rPostNumber { get { return new Regex("^[0-9]{3,14}$"); } }
27 /// <summary>
28 /// 验证手机
29 /// 子类可以根据自己的逻辑去重写
30 /// </summary>
31 protected virtual Regex rMobile { get { return new Regex(@"^1[3|4|5|8][0-9]\d{8}$"); } }
32 /// <summary>
33 /// 验证电话
34 /// 子类可以根据自己的逻辑去重写
35 /// </summary>
36 protected virtual Regex rTelePhone { get { return new Regex(@"^[0-9]{2,4}-\d{6,8}$"); } }
37 /// <summary>
38 /// 验证传真
39 /// 子类可以根据自己的逻辑去重写
40 /// </summary>
41 protected virtual Regex rFex { get { return new Regex(@"/^[0-9]{2,4}-\d{6,8}$"); } }
42 /// <summary>
43 /// 验证Email
44 /// 子类可以根据自己的逻辑去重写
45 /// </summary>
46 protected virtual Regex rEmail { get { return new Regex(@"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"); } }
47 #endregion
48
49 }
50 #endregion
51
52 #region 具体验证模块
53 /// <summary>
54 /// 为空验证
55 /// </summary>
56 [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
57 public class RequiredAttribute : EntityValidationAttribute
58 {
59 public bool AllowEmptyStrings { get; set; }
60 public RequiredAttribute(MessageType messageType, params object[] args) :
61 base(messageType, args)
62 { }
63 public override bool IsValid(object value)
64 {
65 return new System.ComponentModel.DataAnnotations.RequiredAttribute { AllowEmptyStrings = this.AllowEmptyStrings }.IsValid(value);
66 }
67 }
68 /// <summary>
69 /// 范围验证
70 /// </summary>
71 [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
72 public class RangeAttribute : EntityValidationAttribute
73 {
74 private System.ComponentModel.DataAnnotations.RangeAttribute innerRangeAttribute;
75
76 public RangeAttribute(double minimum, double maximum, MessageType messageType, params object[] args) :
77 base(messageType, args)
78 {
79 innerRangeAttribute = new System.ComponentModel.DataAnnotations.RangeAttribute(minimum, maximum);
80 }
81
82 public RangeAttribute(int minimum, int maximum, MessageType messageType, params object[] args) :
83 base(messageType, args)
84 {
85 innerRangeAttribute = new System.ComponentModel.DataAnnotations.RangeAttribute(minimum, maximum);
86 }
87
88 public RangeAttribute(Type type, string minimum, string maximum, MessageType messageType, params object[] args) :
89 base(messageType, args)
90 {
91 innerRangeAttribute = new System.ComponentModel.DataAnnotations.RangeAttribute(type, minimum, maximum);
92 }
93
94 public override bool IsValid(object value)
95 {
96 return innerRangeAttribute.IsValid(value);
97 }
98 }
99
100 /// <summary>
101 /// Email验证
102 /// </summary>
103 [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
104 public class EmailAttribute : EntityValidationAttribute
105 {
106 public EmailAttribute(MessageType messageType, params object[] args) :
107 base(messageType, args) { }
108 public override bool IsValid(object value)
109 {
110 if (value == null)
111 return false;
112 else
113 return rEmail.IsMatch(value.ToString());
114 }
115 }
116
117 /// <summary>
118 /// 数值验证
119 /// </summary>
120 [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
121 public class DigitAttribute : EntityValidationAttribute
122 {
123 public DigitAttribute(MessageType messageType, params object[] args) :
124 base(messageType, args) { }
125 public override bool IsValid(object value)
126 {
127 if (value == null)
128 return false;
129 else
130 return rDigit.IsMatch(value.ToString());
131 }
132
133 }
134
135 /// <summary>
136 /// 邮编验证
137 /// </summary>
138 [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
139 public class PostNumberAttribute : EntityValidationAttribute
140 {
141 public PostNumberAttribute(MessageType messageType, params object[] args) :
142 base(messageType, args) { }
143 public override bool IsValid(object value)
144 {
145 if (value == null)
146 return false;
147 else
148 return rPostNumber.IsMatch(value.ToString());
149 }
150
151 }
152
153 /// <summary>
154 /// 手机验证
155 /// </summary>
156 [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
157 public class MobileAttribute : EntityValidationAttribute
158 {
159 public MobileAttribute(MessageType messageType, params object[] args) :
160 base(messageType, args) { }
161 public override bool IsValid(object value)
162 {
163 if (value == null)
164 return false;
165 else
166 return rMobile.IsMatch(value.ToString());
167 }
168 }
169
170 /// <summary>
171 /// 电话验证
172 /// </summary>
173 [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
174 public class TelePhoneAttribute : EntityValidationAttribute
175 {
176 public TelePhoneAttribute(MessageType messageType, params object[] args) :
177 base(messageType, args) { }
178 public override bool IsValid(object value)
179 {
180 if (value == null)
181 return false;
182 else
183 return rTelePhone.IsMatch(value.ToString());
184 }
185 }
186
187 /// <summary>
188 /// 传真验证
189 /// </summary>
190 [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
191 public class FexAttribute : EntityValidationAttribute
192 {
193 public FexAttribute(MessageType messageType, params object[] args) :
194 base(messageType, args) { }
195 public override bool IsValid(object value)
196 {
197 if (value == null)
198 return false;
199 else
200 return rFex.IsMatch(value.ToString());
201 }
202 }
203 #endregion
204
205 #region 验证消息返回类
206 /// <summary>
207 /// 消息类
208 /// </summary>
209 public class MessageManager
210 {
211 static Dictionary<MessageType, string> messages = new Dictionary<MessageType, string>();
212 static MessageManager()
213 {
214 messages.Add(MessageType.RequiredField, "这个 \"{0}\"是必填的!");
215 messages.Add(MessageType.GreaterThan, "这个 \"{0}\" 的值必须大于 \"{1}\"!");
216 messages.Add(MessageType.LessThan, "这个 \"{0}\" 的值必须小于 \"{1}\"!");
217 messages.Add(MessageType.EmailField, "这个 \"{0}\" 不是有效的Email地址!");
218 messages.Add(MessageType.DigitField, "这个 \"{0}\" 不是有效的数字!");
219 messages.Add(MessageType.PostNumberField, "这个 \"{0}\" 不是有效的邮编!");
220 messages.Add(MessageType.MobileField, "这个 \"{0}\" 不是有效的手机号码!");
221 messages.Add(MessageType.TelePhoneField, "这个 \"{0}\" 不是有效的电话号码!");
222 messages.Add(MessageType.FexField, "这个 \"{0}\" 不是有效的传真!");
223 }
224 /// <summary>
225 /// 得到验证异常的消息集合
226 /// 对外公开
227 /// </summary>
228 /// <param name="messageType">异常消息ID</param>
229 /// <param name="args">消息参数集合</param>
230 /// <returns></returns>
231 public string GetMessage(MessageType messageType, params object[] args)
232 {
233 return string.Format(CultureInfo.CurrentCulture, messages[messageType], args);
234 }
235 /// <summary>
236 /// 本类的实例对象
237 /// </summary>
238 public static MessageManager Current = new MessageManager();
239 }
240
241
242
243 #endregion
244
245 #region 验证类型枚举
246 /// <summary>
247 /// 验证消息类型
248 /// </summary>
249 public enum MessageType
250 {
251 /// <summary>
252 /// 为空验证
253 /// </summary>
254 RequiredField,
255 /// <summary>
256 /// 大于验证
257 /// </summary>
258 GreaterThan,
259 /// <summary>
260 /// 小于验证
261 /// </summary>
262 LessThan,
263 /// <summary>
264 /// 邮箱验证
265 /// </summary>
266 EmailField,
267 /// <summary>
268 /// 数字验证
269 /// </summary>
270 DigitField,
271 /// <summary>
272 /// 邮编验证
273 /// </summary>
274 PostNumberField,
275 /// <summary>
276 /// 手机验证
277 /// </summary>
278 MobileField,
279 /// <summary>
280 /// 电话验证
281 /// </summary>
282 TelePhoneField,
283 /// <summary>
284 /// 传真验证
285 /// </summary>
286 FexField,
287 }
288 #endregion
289
290 }
291
292 完整的实体为:
293
294 /// <summary>
295 /// 人类实体
296 /// </summary>
297 public class Person
298 {
299 /// <summary>
300 /// 姓名
301 /// </summary>
302 [DisplayName("姓名"), Required(MessageType.RequiredField, "Name")]
303 public string Name { get; set; }
304
305 /// <summary>
306 /// 年纪
307 /// </summary>
308 [DisplayName("年纪"), Range(18, int.MaxValue, MessageType.GreaterThan, "Age", 18)]
309 public int Age { get; set; }
310
311 /// <summary>
312 /// 体重
313 /// </summary>
314 [DisplayName("体重"), Range(int.MinValue, 160, MessageType.LessThan, "Weight", 160)]
315 public double Weight { get; set; }
316
317 /// <summary>
318 /// 电子邮件
319 /// </summary>
320 [DisplayName("电子邮件"), Email(MessageType.EmailField, "电子邮件")]
321 public string Email { get; set; }
322
323 /// <summary>
324 /// 手机
325 /// </summary>
326 [DisplayName("手机"), Mobile(MessageType.MobileField, "Mobile")]
327 public string Mobile { get; set; }
328
329 /// <summary>
330 /// 电话
331 /// </summary>
332 [DisplayName("电话"), TelePhone(MessageType.TelePhoneField, "TelePhone")]
333 public string TelePhone { get; set; }
334
335 /// <summary>
336 /// 邮编
337 /// </summary>
338 [DisplayName("邮编"), PostNumber(MessageType.PostNumberField, "PostNumber")]
339 public string PostNumber { get; set; }
340
341 /// <summary>
342 /// 传真
343 /// </summary>
344 [DisplayName("传真"), Fex(MessageType.FexField, "Fex")]
345 public string Fex { get; set; }
346

 

这就是面向对象的程序设计中对验证的统一,也算是一种抽象了。

 

作者:仓储大叔,张占岭,
荣誉:微软MVP