验证输入的日期是否早于今天的日期

本文关键字:日期 今天 输入 是否 验证 于今天 | 更新日期: 2023-09-27 18:34:53

我有一个Html.TextBoxFor元素,用户可以在其中输入他们的出生日期。 我想确保他们只输入比今天的日期早的日期。 这是我在模型中的验证:

[Required(ErrorMessage = "Birthdate is required")]
[RegularExpression(@"^(0[1-9]|1[0-2])'/(0[1-9]|1'd|2'd|3[01])'/(19|20)'d{2}$", ErrorMessage = "Please use MM/DD/YYYY")]
[DataType(DataType.Date)]
public System.DateTime Dob { get; set; }

以下是我观点的相关部分:

<td>
  @Html.Label("DOB:")
  @Html.TextBoxFor(m => m.Driver.Dob, "{0:dd/MM/yyyy}")
  @Html.ValidationMessageFor(m => m.Driver.Dob)
</td>

是否有 .net 提供的内置方法来执行此操作?

验证输入的日期是否早于今天的日期

创建您自己的自定义属性。

[DateValidation]
public System.DateTime Dob { get; set; }
public class DateValidationAttribute : ValidationAttribute {
  public override bool IsValid(object value) {
     DateTime dateValue;
     var date = DateTime.TryParse(value.toString(), out dateValue);
     // "var dateValue = (DateTime) value;" might work as well, let me know what does.
     return dateValue < DateTime.Now;
  }
}

重要: 属性类的名称应以 Attribute 结尾。

你可以

尝试使用IValidatableObject...

那么:

public class MyViewModel : IValidatableObject
{
    [Required(ErrorMessage = "Birthdate is required")]
    [DataType(DataType.Date)]
    public System.DateTime Dob { get; set; }
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if(Dob >= DateTime.Today)
            yield return new ValidationResult("Dob date should be set in the past", new [] { "Dob" });
    }
}

然后到目前为止,只需在控制器中调用ModelState.IsValid对我来说效果很好,但是如果您遇到任何问题,还有其他答案可以解决这个问题

诚然,在这样简单的情况下,根据 Jeroen 的答案创建自己的属性可能会更好、更容易,但如果您需要任何进一步和/或更复杂的逻辑,甚至可能涉及其他类成员,那么IValidatableObject是内置的方法。

如果您同意使用 JQuery DatePicker,请点击此链接,更改

@Html.TextBox("",  String.Format("{0:yyyy-MM-dd}", Model.HasValue ? Model : DateTime.Today), new { @class = "dp", @readonly = "readonly"})
<script type='text/javascript'>
$(document).ready(function () {   
            $(".dp").datepicker({
                maxDate: new Date,
                dateFormat: 'dd/M/yy',
                changeYear: true,
                changeMonth: true
            });
});
</script>