首页 > 解决方案 > MVC 表单验证 | 自定义“验证属性”未收到正确的“值”

问题描述

上下文

我有一个包含两个日期选择器的 MVC 表单,我为此编写了一个自定义验证属性,以确保两个选定的日期都不是过去的(>= 今天)。

问题

验证属性仅适用于第一个日期,但不适用于第二个日期,因为在验证属性中传递给“值”对象的值始终重置为表单类 ( HomeForm.cs ) 构造函数 ( HomeForm( )中设置的值)。

问题示例

编码

这是我的表格HomeForm.cs)

public class HomeForm

    {
        public HomeForm()
        {
            dateA = DateTime.Now.Date;
            TimeSpan time = new TimeSpan(1, 0, 0, 0);
            dateB = DateTime.Now.Date + time;
        }

        [Required(ErrorMessage = "You must select a departure date.")]
        [DataType(DataType.Date)]
        [DisplayName("Departure date:")]
        [DateTimeRange]

        public DateTime dateA { get; set; }

        [Required(ErrorMessage = "You must select a return date.")]
        [DataType(DataType.Date)]
        [DisplayName("Return date:")]
        [DateTimeRange]

        public DateTime dateB { get; set; }  
    };

自定义验证属性“DateTimeRange”应用于dateAdateB

[AttributeUsage(AttributeTargets.Property)]

    public class DateTimeRangeAttribute : ValidationAttribute
    {
        private readonly DateTime _today;
        public DateTimeRangeAttribute()
        {
            _today = DateTime.Now.Date;
        }
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {

            if (value is not DateTime)
                return new ValidationResult("Date format is not valid.");

            if (!IsValid((DateTime)value))
                return new ValidationResult("Chosen date is in the past.");

            if(value.ToString().Count() != 19)
                return new ValidationResult("Not a valid date. Choose a different one.");

            return ValidationResult.Success;
        }
        private bool IsValid(DateTime value)
        {
            value = value.Date;
            return value >= _today;
        }

    }

标签: c#asp.net-mvcvalidationattributes

解决方案


推荐阅读