using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace XdCxRhDW.Dto
{
///
/// int或枚举类型范围限制,默认不包含最小值,包含最大值
///
public class RangeIntAttribute : ValidationAttribute
{
///
///
///
public RangeIntAttribute()
{
}
///
///
///
///
public RangeIntAttribute(int min)
{
this.Min = min;
}
///
///
///
///
///
public RangeIntAttribute(int min, int max)
{
this.Min = min;
this.Max = max;
}
///
/// 最小值(为Null不会验证最小值)
///
public int? Min { get; set; }
///
/// 最大值(为Null不会验证最大值)
///
public int? Max { get; set; }
///
/// 是否包含最小值(默认不包含最小值)
///
public bool IncludeMin { get; set; } = false;
///
/// 是否包含最大值(默认包含最大值)
///
public bool IncludeMax { get; set; } = true;
///
/// Range验证
///
///
///
///
public override bool IsValid(object value)
{
if (value == null) return true;
if (value.GetType() != typeof(int) && !value.GetType().IsEnum)
{
throw new Exception($"{nameof(RangeIntAttribute)}只能用于int或枚举类型!");
}
var val = (int)value;
if (Min == null && Max == null) return true;
else if (Min != null && Max != null)
{
if (IncludeMin && IncludeMax)
{
ErrorMessage = "字段 {0} 范围" + $"[{Min},{Max}],当前值{val}";
return val >= Min && val <= Max;
}
else if (IncludeMin && !IncludeMax)
{
ErrorMessage = "字段 {0} 范围" + $"[{Min},{Max}),当前值{val}";
return val >= Min && val < Max;
}
else if (!IncludeMin && IncludeMax)
{
ErrorMessage = "字段 {0} 范围" + $"({Min},{Max}],当前值{val}";
return val > Min && val <= Max;
}
else
{
ErrorMessage = "字段 {0} 范围" + $"({Min},{Max}),当前值{val}";
return val > Min && val < Max;
}
}
else if (Min != null && Max == null)
{
if (IncludeMin)
{
ErrorMessage = "字段 {0} 必须大于等于" + $"{Min},当前值{val}";
return val >= Min;
}
else
{
ErrorMessage = "字段 {0} 必须大于" + $"{Min},当前值{val}";
return val > Min;
}
}
else//Min==null&&Max!=null
{
if (IncludeMax)
{
ErrorMessage = "字段 {0} 必须小于等于" + $"{Max},当前值{val}";
return val <= Max;
}
else
{
ErrorMessage = "字段 {0} 必须小于" + $"{Max},当前值{val}";
return val < Max;
}
}
}
}
///
/// long类型范围限制,默认不包含最小值,包含最大值
///
public class RangeLongAttribute : ValidationAttribute
{
///
///
///
public RangeLongAttribute()
{
}
///
///
///
///
public RangeLongAttribute(long min)
{
this.Min = min;
}
///
///
///
///
///
public RangeLongAttribute(long min, long max)
{
this.Min = min;
this.Max = max;
}
///
/// 最小值(为Null不会验证最小值)
///
public long? Min { get; set; }
///
/// 最大值(为Null不会验证最大值)
///
public long? Max { get; set; }
///
/// 是否包含最小值(默认不包含最小值)
///
public bool IncludeMin { get; set; } = false;
///
/// 是否包含最大值(默认包含最大值)
///
public bool IncludeMax { get; set; } = true;
///
/// Range验证
///
///
///
///
public override bool IsValid(object value)
{
if (value == null) return true;
if (value.GetType() != typeof(long) && !value.GetType().IsEnum)
{
throw new Exception($"{nameof(RangeLongAttribute)}只能用于long类型!");
}
var val = (long)value;
if (Min == null && Max == null) return true;
else if (Min != null && Max != null)
{
if (IncludeMin && IncludeMax)
{
ErrorMessage = "字段 {0} 范围" + $"[{Min},{Max}],当前值{val}";
return val >= Min && val <= Max;
}
else if (IncludeMin && !IncludeMax)
{
ErrorMessage = "字段 {0} 范围" + $"[{Min},{Max}),当前值{val}";
return val >= Min && val < Max;
}
else if (!IncludeMin && IncludeMax)
{
ErrorMessage = "字段 {0} 范围" + $"({Min},{Max}],当前值{val}";
return val > Min && val <= Max;
}
else
{
ErrorMessage = "字段 {0} 范围" + $"({Min},{Max}),当前值{val}";
return val > Min && val < Max;
}
}
else if (Min != null && Max == null)
{
if (IncludeMin)
{
ErrorMessage = "字段 {0} 必须大于等于" + $"{Min},当前值{val}";
return val >= Min;
}
else
{
ErrorMessage = "字段 {0} 必须大于" + $"{Min},当前值{val}";
return val > Min;
}
}
else//Min==null&&Max!=null
{
if (IncludeMax)
{
ErrorMessage = "字段 {0} 必须小于等于" + $"{Max},当前值{val}";
return val <= Max;
}
else
{
ErrorMessage = "字段 {0} 必须小于" + $"{Max},当前值{val}";
return val < Max;
}
}
}
}
///
/// double类型范围限制,默认不包含最小值,包含最大值
///
public class RangeDoubleAttribute : ValidationAttribute
{
///
///
///
public RangeDoubleAttribute()
{
}
///
///
///
///
public RangeDoubleAttribute(double min)
{
this.Min = min;
}
///
///
///
///
///
public RangeDoubleAttribute(double min, double max)
{
this.Min = min;
this.Max = max;
}
///
/// 最小值(为Null不会验证最小值)
///
public double? Min { get; set; }
///
/// 最大值(为Null不会验证最大值)
///
public double? Max { get; set; }
///
/// 是否包含最小值(默认不包含最小值)
///
public bool IncludeMin { get; set; } = false;
///
/// 是否包含最大值(默认包含最大值)
///
public bool IncludeMax { get; set; } = true;
///
/// Range验证
///
///
///
///
public override bool IsValid(object value)
{
if (value == null) return true;
if (value.GetType() != typeof(double))
{
throw new Exception($"{nameof(RangeDoubleAttribute)}只能用于double类型!");
}
var val = (double)value;
if (Min == null && Max == null) return true;
else if (Min != null && Max != null)
{
if (IncludeMin && IncludeMax)
{
ErrorMessage = "字段 {0} 范围" + $"[{Min},{Max}],当前值{val}";
return val >= Min && val <= Max;
}
else if (IncludeMin && !IncludeMax)
{
ErrorMessage = "字段 {0} 范围" + $"[{Min},{Max}),当前值{val}";
return val >= Min && val < Max;
}
else if (!IncludeMin && IncludeMax)
{
ErrorMessage = "字段 {0} 范围" + $"({Min},{Max}],当前值{val}";
return val > Min && val <= Max;
}
else
{
ErrorMessage = "字段 {0} 范围" + $"({Min},{Max}),当前值{val}";
return val > Min && val < Max;
}
}
else if (Min != null && Max == null)
{
if (IncludeMin)
{
ErrorMessage = "字段 {0} 必须大于等于" + $"{Min},当前值{val}";
return val >= Min;
}
else
{
ErrorMessage = "字段 {0} 必须大于" + $"{Min},当前值{val}";
return val > Min;
}
}
else//Min==null&&Max!=null
{
if (IncludeMax)
{
ErrorMessage = "字段 {0} 必须小于等于" + $"{Max},当前值{val}";
return val <= Max;
}
else
{
ErrorMessage = "字段 {0} 必须小于" + $"{Max},当前值{val}";
return val < Max;
}
}
}
}
}