数据注释日期范围

发布于 2024-08-04 05:15:35 字数 164 浏览 9 评论 0原文

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

类似的东西

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

Is it possible to use [Range] annotation for dates?

something like

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

聊慰 2024-08-11 05:15:35

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

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

I did this to fix your problem

 public class DateAttribute : RangeAttribute
   {
      public DateAttribute()
        : base(typeof(DateTime), DateTime.Now.AddYears(-20).ToShortDateString(),     DateTime.Now.AddYears(2).ToShortDateString()) { } 
   }
公布 2024-08-11 05:15:35

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;}

Docs on MSDN says you can use the 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;}
苹果你个爱泡泡 2024-08-11 05:15:35

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

jQuery validation does not work with [Range(typeof(DateTime),"date1","date2"] --
My MSDN doc is incorrect.

肥爪爪 2024-08-11 05:15:35

这是另一个解决方案。

[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; }

只需创建一个名为 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);
            }
        }
    }
}

Here is another solution.

[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; }

The simply create a new MVC controller called ValidationController and past this code in there. The nice thing about the "Remote" approach is you can leverage this framework to handle any kind of validations based on your custom logic.

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);
            }
        }
    }
}
也只是曾经 2024-08-11 05:15:35

对于那些罕见的情况,当您被迫将日期写为字符串时(使用属性时),我强烈建议使用 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;}

For those rare occurrences when you are forced to write a date as a string (when using attributes), I highly recommend using the ISO-8601 notation.
That eliminates any confusion as to whether 01/02/2004 is january 2nd or february 1st.

[Range(typeof(DateTime), "2004-12-01", "2004-12-31",
    ErrorMessage = "Value for {0} must be between {1} and {2}")]
public datetime Something { get; set;}
征﹌骨岁月お 2024-08-11 05:15:35

我使用这种方法:

[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-M-d")]
ErrorMessage = "Value for {0} must be between {1} and {2}")]

I use this approach:

[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);
}

And use it like so:

[DateRange("2004-12-01", "2004-12-2", "yyyy-M-d")]
ErrorMessage = "Value for {0} must be between {1} and {2}")]
迷途知返 2024-08-11 05:15:35

我发现了 [Range(typeof(DateTime)] 注释的问题,并将其描述为“充其量是笨重的”,如果它有效的话,它留下了太多的机会。

远程验证似乎是一个很好的方法:避免在视图中使用 JavaScript 并维护服务器端代码的完整性,如果我可以避免的话,我个人从不喜欢将代码发送到客户端来执行

。 aaronstannard.com/remote-validation-asp-net-mvc3/" rel="nofollow noreferrer">关于 MVC3 中远程验证的文章

模型

public class SomeDateModel
{
    public int MinYears = 18;
    public int MaxYears = 110;

    [Display(Name = "Date of birth", Prompt = "e.g. 01/01/1900")]
    [Remote(action: "ValidateDateBetweenYearsFromNow", controller: "Validation", areaReference: AreaReference.UseRoot, AdditionalFields = "MinYears,MaxYears", HttpMethod = "GET" ,ErrorMessage = "Subject must be over 18")]
    public DateTime? DOB { get; set; }
}

控制器 - 部署在根目录

namespace Controllers
{
    public class ValidationController : Controller
    {
        [HttpGet]
        [ActionName("ValidateDateBetweenYearsFromNow")]
        public JsonResult ValidateDateBetweenYearsFromNow_Get()
        {
            //This method expects 3 parameters, they're anonymously declared through the Request Querystring,
            //Ensure the order of params is:
            //[0] DateTime
            //[1] Int Minmum Years Ago e.g. for 18 years from today this would be 18
            //[2] int Maximum Years Ago e.g. for 100 years from today this would be 100
            var msg = string.Format("An error occured checking the Date field validity");
            try
            {
                int MinYears = int.Parse(Request.QueryString[1]);
                int MaxYears = int.Parse(Request.QueryString[2]);

                //Use (0 - x) to invert the positive int to a negative.
                var min = DateTime.Now.AddYears((0-MinYears));
                var max = DateTime.Now.AddYears((0-MaxYears));

                //reset the response error msg now all parsing and assignmenst succeeded.
                msg = string.Format("Please enter a value between {0:dd/MM/yyyy} and {1:dd/MM/yyyy}", max, min);
                var date = DateTime.Parse(Request.QueryString[0]);
                if (date > min || date < max)
                    //switch the return value here from "msg" to "false" as a bool to use the MODEL error message
                    return Json(msg, JsonRequestBehavior.AllowGet);
                else
                    return Json(true, JsonRequestBehavior.AllowGet);
            }
            catch (Exception)
            {
                return Json(msg, JsonRequestBehavior.AllowGet);
            }
        }
    }
}

msg 变量显示为 Html 帮助器 ValidationSummary 或 Html 帮助器 ValidationFor(x=>x.DATETIME)

View

一部分,值得注意的是作为参数 2 和 3 传递的字段必须存在于视图中,以便远程验证将值传递到控制器:

    @Html.EditorFor(m => m.DOB)
    @Html.HiddenFor(m => m.MinYears)
    @Html.HiddenFor(m => m.MaxYears)
    @Html.ValidationSummary()

模型和 Html 帮助程序将为您完成所有 jquery 工作。

I found issues with the [Range(typeof(DateTime)] annotation and would describe it as "clunky at best" it leaves too much to chance IF it works.

Remote validation seems to be a good way of: avoiding javascript in views and maintaining server side code integrity, personally never like sending code to a client to execute if I can avoid it.

Using @StackThis answer as a base and reference to an article on remote validation in MVC3

Model

public class SomeDateModel
{
    public int MinYears = 18;
    public int MaxYears = 110;

    [Display(Name = "Date of birth", Prompt = "e.g. 01/01/1900")]
    [Remote(action: "ValidateDateBetweenYearsFromNow", controller: "Validation", areaReference: AreaReference.UseRoot, AdditionalFields = "MinYears,MaxYears", HttpMethod = "GET" ,ErrorMessage = "Subject must be over 18")]
    public DateTime? DOB { get; set; }
}

Controller - Deployed at the root directory

namespace Controllers
{
    public class ValidationController : Controller
    {
        [HttpGet]
        [ActionName("ValidateDateBetweenYearsFromNow")]
        public JsonResult ValidateDateBetweenYearsFromNow_Get()
        {
            //This method expects 3 parameters, they're anonymously declared through the Request Querystring,
            //Ensure the order of params is:
            //[0] DateTime
            //[1] Int Minmum Years Ago e.g. for 18 years from today this would be 18
            //[2] int Maximum Years Ago e.g. for 100 years from today this would be 100
            var msg = string.Format("An error occured checking the Date field validity");
            try
            {
                int MinYears = int.Parse(Request.QueryString[1]);
                int MaxYears = int.Parse(Request.QueryString[2]);

                //Use (0 - x) to invert the positive int to a negative.
                var min = DateTime.Now.AddYears((0-MinYears));
                var max = DateTime.Now.AddYears((0-MaxYears));

                //reset the response error msg now all parsing and assignmenst succeeded.
                msg = string.Format("Please enter a value between {0:dd/MM/yyyy} and {1:dd/MM/yyyy}", max, min);
                var date = DateTime.Parse(Request.QueryString[0]);
                if (date > min || date < max)
                    //switch the return value here from "msg" to "false" as a bool to use the MODEL error message
                    return Json(msg, JsonRequestBehavior.AllowGet);
                else
                    return Json(true, JsonRequestBehavior.AllowGet);
            }
            catch (Exception)
            {
                return Json(msg, JsonRequestBehavior.AllowGet);
            }
        }
    }
}

The msg variable is displayed as part of the Html helper ValidationSummary or the Html helper ValidationFor(x=>x.DATETIME)

View

It's important to note that the fields passed as parameter 2 and 3 must exist in the view in order for the remote validation to pass the values to the controller:

    @Html.EditorFor(m => m.DOB)
    @Html.HiddenFor(m => m.MinYears)
    @Html.HiddenFor(m => m.MaxYears)
    @Html.ValidationSummary()

The model and Html helpers will do all the jquery work for you.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文