日期的数据注释范围

Dav*_*avy 46 c# model-view-controller asp.net-mvc date data-annotations

是否可以使用[Range]日期注释?

就像是

[Range(typeof(DateTime), DateTime.MinValue.ToString(), DateTime.Today.ToString())]
Run Code Online (Sandbox Code Playgroud)

Mar*_*way 61

我这样做是为了解决你的问题

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

  • 刚刚遇到这个,并惊讶于它是多么简单但有效!不敢相信票数这么少。 (3认同)

Dan*_*ott 49

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;}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的所有帮助 Dan - 这似乎有效,但我无法将硬编码字符串替换为 DateTime.Now.Date.toString() 我得到:属性参数必须是常量表达式、typeof 表达式或数组创建表达式属性参数类型 Sry - 我可能在做一些愚蠢的事情:) Davy (2认同)

Ric*_*SFT 9

jQuery验证不适用于[Range(typeof(DateTime),"date1","date2"] - 我的MSDN文档不正确


Sta*_*his 6

这是另一种解决方案。

[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; }
Run Code Online (Sandbox Code Playgroud)

只需创建一个名为ValidationController的新MVC控制器,然后将此代码放在其中即可。关于“远程”方法的好处是,您可以利用此框架根据您的自定义逻辑来处理任何类型的验证。

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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Tik*_*all 5

对于那些在您被迫以字符串形式写日期时很少发生的事情(使用属性时),我强烈建议使用ISO-8601表示法.这消除了关于01/02/2004是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;}
Run Code Online (Sandbox Code Playgroud)