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

时间:2013-10-10 20:02:23

标签: c# asp.net-mvc-4 razor

我有一个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是否提供内置方式来执行此操作?

3 个答案:

答案 0 :(得分:2)

创建自己的自定义属性。

[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结尾。

答案 1 :(得分:2)

您可以尝试使用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到目前为止工作正常,但如果您遇到任何问题,可以other answers that tackle that problem

不可否认,在这种简单的情况下,根据Jeroen的答案创建自己的属性可能会更好更容易,但如果您需要任何可能涉及其他类成员的进一步和/或更复杂的逻辑,那么{{1}是内置的方式。

答案 2 :(得分:0)

如果您对使用JQuery DatePicker感到满意,请关注this link,更改

@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>