date的数据注释范围

是否可以使用[Range]注解date?

就像是

 [Range(typeof(DateTime), DateTime.MinValue.ToString(), DateTime.Today.ToString())] 

MSDN上的文档说您可以使用RangeAttribute

 [Range(typeof(DateTime), "1/2/2004", "3/4/2004", ErrorMessage = "Value for {0} must be between {1} and {2}")] public datetime Something { get; set;} 

我这样做来解决你的问题

  public class DateAttribute : RangeAttribute { public DateAttribute() : base(typeof(DateTime), DateTime.Now.AddYears(-20).ToShortDateString(), DateTime.Now.AddYears(2).ToShortDateString()) { } } 

jQueryvalidation不适用于[范围(typeof(DateTime),“date1”,“date2”] – 我的MSDN文档不正确

对于那些罕见的情况,当你被迫写一个string的date(当使用属性时),我强烈build议使用ISO-8601表示法。 这消除了2004年1月2日是1月2日还是2月1日的混淆。

 [Range(typeof(DateTime), "2004-12-01", "2004-12-31", ErrorMessage = "Value for {0} must be between {1} and {2}")] public datetime Something { get; set;} 

这是另一个解决scheme。

 [Required(ErrorMessage = "Date Of Birth is Required")] [DataType(DataType.Date, ErrorMessage ="Invalid Date Format")] [Remote("IsValidDateOfBirth", "Validation", HttpMethod = "POST", ErrorMessage = "Please provide a valid date of birth.")] [Display(Name ="Date of Birth")] public DateTime DOB{ get; set; } 

简单地创build一个名为ValidationController的新MVC控制器,并在其中放置此代码。 关于“远程”方法的好处是你可以利用这个框架来处理基于你的定制逻辑的任何types的validation。

 using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Net.Mail; using System.Web; using System.Web.Mvc; namespace YOURNAMESPACEHERE { public class ValidationController : Controller { [HttpPost] public JsonResult IsValidDateOfBirth(string dob) { var min = DateTime.Now.AddYears(-21); var max = DateTime.Now.AddYears(-110); var msg = string.Format("Please enter a value between {0:MM/dd/yyyy} and {1:MM/dd/yyyy}", max,min ); try { var date = DateTime.Parse(dob); if(date > min || date < max) return Json(msg); else return Json(true); } catch (Exception) { return Json(msg); } } } } 

我使用这种方法:

 [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)] internal sealed class DateRangeAttribute : ValidationAttribute { public DateTime Minimum { get; } public DateTime Maximum { get; } public DateRangeAttribute(string minimum = null, string maximum = null, string format = null) { format = format ?? @"yyyy-MM-dd'T'HH:mm:ss.FFFK"; //iso8601 Minimum = minimum == null ? DateTime.MinValue : DateTime.ParseExact(minimum, new[] { format }, CultureInfo.InvariantCulture, DateTimeStyles.None); //0 invariantculture Maximum = maximum == null ? DateTime.MaxValue : DateTime.ParseExact(maximum, new[] { format }, CultureInfo.InvariantCulture, DateTimeStyles.None); //0 invariantculture if (Minimum > Maximum) throw new InvalidOperationException($"Specified max-date '{maximum}' is less than the specified min-date '{minimum}'"); } //0 the sole reason for employing this custom validator instead of the mere rangevalidator is that we wanted to apply invariantculture to the parsing instead of // using currentculture like the range attribute does this is immensely important in order for us to be able to dodge nasty hiccups in production environments public override bool IsValid(object value) { if (value == null) //0 null return true; var s = value as string; if (s != null && string.IsNullOrEmpty(s)) //0 null return true; var min = (IComparable)Minimum; var max = (IComparable)Maximum; return min.CompareTo(value) <= 0 && max.CompareTo(value) >= 0; } //0 null values should be handled with the required attribute public override string FormatErrorMessage(string name) => string.Format(CultureInfo.CurrentCulture, ErrorMessageString, name, Minimum, Maximum); } 

像这样使用它:

 [DateRange("2004-12-01", "2004-12-2", "yyyy-Md")] ErrorMessage = "Value for {0} must be between {1} and {2}")]