日期的MVC模型验证

Cyb*_*cop 18 c# asp.net-mvc model-validation asp.net-mvc-5

MVC 5是否有默认验证,我可以设置日期的最小值和最大值?

在我的模型中,我想要日期验证

    public class MyClass
    {               
        [Required(ErrorMessage="Start date and time cannot be empty")]
        //validate:Must be greater than current date
        [DataType(DataType.DateTime)]
        public DateTime StartDateTime { get; set; }

        [Required(ErrorMessage="End date and time cannot be empty")]
        //validate:must be greater than StartDate
        [DataType(DataType.DateTime)]
        public DateTime EndDateTime { get; set; }            
    }
Run Code Online (Sandbox Code Playgroud)

Ps:根据这个Asp.Net网站,使用RangeDateTime验证器时出现问题,不推荐使用.

注意:jQuery验证不适用于Range属性和DateTime.例如,以下代码将始终显示客户端验证错误,即使日期在指定范围内:

[Range(typeof(DateTime), "1/1/1966", "1/1/2020")]

您需要禁用jQuery日期验证才能将Range属性与DateTime一起使用.在模型中编译硬日期通常不是一个好习惯,因此不鼓励使用Range属性和DateTime.

我也知道有一些像Fluent ValidationFoolproof这样的Nuget软件包可以验证和检查一个日期是否比其他日期更大,但我想知道默认情况下是否有东西可以检查日期的最小值和最大值.

从我在MVC 5.1中的Whats new中看到的,有支持MaxLengthMinLength验证.

小智 9

没有必要禁用jQuery日期验证(这可能会导致其他问题).你只需要覆盖的range方法$.validator.

默认情况下,它使用数值(然后回退到字符串比较),因此您可以添加以下脚本(在jquery.validate.js和之后jquery.validate.unobtrusive.js,但不包括在内)$(document).ready

$.validator.methods.range = function(value, element, param) {
    if ($(element).attr('data-val-date')) {
        var min = $(element).attr('data-val-range-min');
        var max = $(element).attr('data-val-range-max');
        var date = new Date(value).getTime();
        var minDate = new Date(min).getTime();
        var maxDate = new Date(max).getTime();
        return this.optional(element) || (date >= minDate && date <= maxDate);
    }
    // use the default method
    return this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );
};
Run Code Online (Sandbox Code Playgroud)

然后你可以使用RangeAttribute你的财产

[Range(typeof(DateTime), "1/1/1966", "1/1/2020")]
public DateTime Date { get; set; }
Run Code Online (Sandbox Code Playgroud)

  • 在 ASP.NET Core 5.0 中,“data-val-date”未添加到输入元素中,因此您必须手动将其添加到输入标记帮助器中。此外,如果将绑定设置为 [DataType(DataType.Date)],则它不会在输入元素值中包含时间部分。Date(value) 需要有一个时间值,否则 minDate 检查会因休息一天而失败。 (3认同)
  • 谁能解释一下如何实施这个解决方案?如何添加提供的脚本? (2认同)

Phi*_*ove 6

我将使用IValidatableObjectSystem.ComponentModel.DataAnnotations中的接口执行此操作,该接口允许您添加额外的验证规则,您可以在其中进行更多检查.将接口添加到您的类,然后实现该Validate方法,您可以将StartDateTime与当前日期/时间进行比较,还可以将EndDateTime与StartDateTime进行比较,例如

public class MyClass : IValidatableObject
{               
    [Required(ErrorMessage="Start date and time cannot be empty")]
    //validate:Must be greater than current date
    [DataType(DataType.DateTime)]
    public DateTime StartDateTime { get; set; }

    [Required(ErrorMessage="End date and time cannot be empty")]
    //validate:must be greater than StartDate
    [DataType(DataType.DateTime)]
    public DateTime EndDateTime { get; set; }       

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        List<ValidationResult> results = new List<ValidationResult>();

        if (StartDateTime < DateTime.Now)
        {
            results.Add(new ValidationResult("Start date and time must be greater than current time", new []{"StartDateTime"}));
        }

        if (EndDateTime <= StartDateTime)
        {
            results.Add(new ValidationResult("EndDateTime must be greater that StartDateTime", new [] {"EndDateTime"}));
        }

        return results;
    }     
}
Run Code Online (Sandbox Code Playgroud)

唯一可能的缺点是Validate运行服务器端,而不是jQuery验证.