RangeAttribute.cs 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel.DataAnnotations;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace XdCxRhDw.Dto
  8. {
  9. /// <summary>
  10. /// int或枚举类型范围限制,默认不包含最小值,包含最大值
  11. /// </summary>
  12. public class RangeIntAttribute : ValidationAttribute
  13. {
  14. /// <summary>
  15. ///
  16. /// </summary>
  17. public RangeIntAttribute()
  18. {
  19. }
  20. /// <summary>
  21. ///
  22. /// </summary>
  23. /// <param name="min"></param>
  24. public RangeIntAttribute(int min)
  25. {
  26. this.Min = min;
  27. }
  28. /// <summary>
  29. ///
  30. /// </summary>
  31. /// <param name="min"></param>
  32. /// <param name="max"></param>
  33. public RangeIntAttribute(int min, int max)
  34. {
  35. this.Min = min;
  36. this.Max = max;
  37. }
  38. /// <summary>
  39. /// 最小值(为Null不会验证最小值)
  40. /// </summary>
  41. public int? Min { get; set; }
  42. /// <summary>
  43. /// 最大值(为Null不会验证最大值)
  44. /// </summary>
  45. public int? Max { get; set; }
  46. /// <summary>
  47. /// 是否包含最小值(默认不包含最小值)
  48. /// </summary>
  49. public bool IncludeMin { get; set; } = false;
  50. /// <summary>
  51. /// 是否包含最大值(默认包含最大值)
  52. /// </summary>
  53. public bool IncludeMax { get; set; } = true;
  54. /// <summary>
  55. /// Range验证
  56. /// </summary>
  57. /// <param name="value"></param>
  58. /// <returns></returns>
  59. /// <exception cref="Exception"></exception>
  60. public override bool IsValid(object value)
  61. {
  62. if (value.GetType() != typeof(int) && !value.GetType().IsEnum)
  63. {
  64. throw new Exception($"{nameof(RangeIntAttribute)}只能用于int或枚举类型!");
  65. }
  66. var val = (int)value;
  67. if (Min == null && Max == null) return true;
  68. else if (Min != null && Max != null)
  69. {
  70. if (IncludeMin && IncludeMax)
  71. {
  72. ErrorMessage = "字段 {0} 范围" + $"[{Min},{Max}]";
  73. return val >= Min && val <= Max;
  74. }
  75. else if (IncludeMin && !IncludeMax)
  76. {
  77. ErrorMessage = "字段 {0} 范围" + $"[{Min},{Max})";
  78. return val >= Min && val < Max;
  79. }
  80. else if (!IncludeMin && IncludeMax)
  81. {
  82. ErrorMessage = "字段 {0} 范围" + $"({Min},{Max}]";
  83. return val > Min && val <= Max;
  84. }
  85. else
  86. {
  87. ErrorMessage = "字段 {0} 范围" + $"({Min},{Max})";
  88. return val > Min && val < Max;
  89. }
  90. }
  91. else if (Min != null && Max == null)
  92. {
  93. if (IncludeMin)
  94. {
  95. ErrorMessage = "字段 {0} 必须大于等于" + $"{Min}";
  96. return val >= Min;
  97. }
  98. else
  99. {
  100. ErrorMessage = "字段 {0} 必须大于" + $"{Min}";
  101. return val > Min;
  102. }
  103. }
  104. else//Min==null&&Max!=null
  105. {
  106. if (IncludeMax)
  107. {
  108. ErrorMessage = "字段 {0} 必须小于等于" + $"{Max}";
  109. return val <= Max;
  110. }
  111. else
  112. {
  113. ErrorMessage = "字段 {0} 必须小于" + $"{Max}";
  114. return val < Max;
  115. }
  116. }
  117. }
  118. }
  119. /// <summary>
  120. /// double类型范围限制,默认不包含最小值,包含最大值
  121. /// </summary>
  122. public class RangeDoubleAttribute : ValidationAttribute
  123. {
  124. /// <summary>
  125. ///
  126. /// </summary>
  127. public RangeDoubleAttribute()
  128. {
  129. }
  130. /// <summary>
  131. ///
  132. /// </summary>
  133. /// <param name="min"></param>
  134. public RangeDoubleAttribute(double min)
  135. {
  136. this.Min = min;
  137. }
  138. /// <summary>
  139. ///
  140. /// </summary>
  141. /// <param name="min"></param>
  142. /// <param name="max"></param>
  143. public RangeDoubleAttribute(double min, double max)
  144. {
  145. this.Min = min;
  146. this.Max = max;
  147. }
  148. /// <summary>
  149. /// 最小值(为Null不会验证最小值)
  150. /// </summary>
  151. public double? Min { get; set; }
  152. /// <summary>
  153. /// 最大值(为Null不会验证最大值)
  154. /// </summary>
  155. public double? Max { get; set; }
  156. /// <summary>
  157. /// 是否包含最小值(默认不包含最小值)
  158. /// </summary>
  159. public bool IncludeMin { get; set; } = false;
  160. /// <summary>
  161. /// 是否包含最大值(默认包含最大值)
  162. /// </summary>
  163. public bool IncludeMax { get; set; } = true;
  164. /// <summary>
  165. /// Range验证
  166. /// </summary>
  167. /// <param name="value"></param>
  168. /// <returns></returns>
  169. /// <exception cref="Exception"></exception>
  170. public override bool IsValid(object value)
  171. {
  172. if (value.GetType() != typeof(double))
  173. {
  174. throw new Exception($"{nameof(RangeDoubleAttribute)}只能用于double类型!");
  175. }
  176. var val = (double)value;
  177. if (Min == null && Max == null) return true;
  178. else if (Min != null && Max != null)
  179. {
  180. if (IncludeMin && IncludeMax)
  181. {
  182. ErrorMessage = "字段 {0} 范围" + $"[{Min},{Max}]";
  183. return val >= Min && val <= Max;
  184. }
  185. else if (IncludeMin && !IncludeMax)
  186. {
  187. ErrorMessage = "字段 {0} 范围" + $"[{Min},{Max})";
  188. return val >= Min && val < Max;
  189. }
  190. else if (!IncludeMin && IncludeMax)
  191. {
  192. ErrorMessage = "字段 {0} 范围" + $"({Min},{Max}]";
  193. return val > Min && val <= Max;
  194. }
  195. else
  196. {
  197. ErrorMessage = "字段 {0} 范围" + $"({Min},{Max})";
  198. return val > Min && val < Max;
  199. }
  200. }
  201. else if (Min != null && Max == null)
  202. {
  203. if (IncludeMin)
  204. {
  205. ErrorMessage = "字段 {0} 必须大于等于" + $"{Min}";
  206. return val >= Min;
  207. }
  208. else
  209. {
  210. ErrorMessage = "字段 {0} 必须大于" + $"{Min}";
  211. return val > Min;
  212. }
  213. }
  214. else//Min==null&&Max!=null
  215. {
  216. if (IncludeMax)
  217. {
  218. ErrorMessage = "字段 {0} 必须小于等于" + $"{Max}";
  219. return val <= Max;
  220. }
  221. else
  222. {
  223. ErrorMessage = "字段 {0} 必须小于" + $"{Max}";
  224. return val < Max;
  225. }
  226. }
  227. }
  228. }
  229. }