C# 验证输入的日期是否早于今天';日期

C# 验证输入的日期是否早于今天';日期,c#,asp.net-mvc-4,razor,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")] [DataTy

我有一个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>

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

.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;
  }
}
[日期验证]
public System.DateTime Dob{get;set;}
公共类DateValidationAttribute:ValidationAttribute{
公共覆盖布尔值有效(对象值){
日期时间日期值;
var date=DateTime.TryParse(value.toString(),out dateValue);
//“var dateValue=(DateTime)value;”也可以,请告诉我该怎么做。
return dateValue

重要提示:属性类的名称应以创建自己的自定义属性结尾

[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;
  }
}
[日期验证]
public System.DateTime Dob{get;set;}
公共类DateValidationAttribute:ValidationAttribute{
公共覆盖布尔值有效(对象值){
日期时间日期值;
var date=DateTime.TryParse(value.toString(),out dateValue);
//“var dateValue=(DateTime)value;”也可以,请告诉我该怎么做。
return dateValue
重要提示:属性类的名称应以
attribute

结尾,您可以尝试使用

那么:

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" });
    }
}
公共类MyViewModel:IValidatableObject
{
[必需(ErrorMessage=“需要生日”)]
[数据类型(DataType.Date)]
public System.DateTime Dob{get;set;}
公共IEnumerable验证(ValidationContext ValidationContext)
{
如果(Dob>=DateTime.Today)
产生返回新的ValidationResult(“Dob日期应设置在过去”,new[]{“Dob”});
}
}
到目前为止,只需在控制器中调用
ModelState.IsValid
对我来说效果很好,但如果您遇到任何问题,则会出现问题

诚然,在这样一个简单的情况下,根据Jeroen的答案创建自己的属性可能更好、更容易,但如果您需要更进一步和/或更复杂的逻辑,甚至可能涉及其他类成员,那么
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" });
    }
}
公共类MyViewModel:IValidatableObject
{
[必需(ErrorMessage=“需要生日”)]
[数据类型(DataType.Date)]
public System.DateTime Dob{get;set;}
公共IEnumerable验证(ValidationContext ValidationContext)
{
如果(Dob>=DateTime.Today)
产生返回新的ValidationResult(“Dob日期应设置在过去”,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”})
$(文档).ready(函数(){
$(“.dp”).datepicker({
maxDate:新日期,
日期格式:'dd/M/yy',
变化年:是的,
变化月:对
});
});

如果您可以使用JQuery日期选择器,请遵循,更改

@Html.TextBox(“,String.Format({0:yyyy-MM-dd}),Model.HasValue?Model:DateTime.Today),new{@class=“dp”,@readonly=“readonly”})
$(文档).ready(函数(){
$(“.dp”).datepicker({
maxDate:新日期,
日期格式:'dd/M/yy',
变化年:是的,
变化月:对
});
});

我尝试了两种方法,在您的示例中保留了相同的类和方法名称,但当我输入“10/01/2014”这样的日期时,它无法捕捉到它。我尝试了两种方法,在您的示例中保留了相同的类和方法名称,但当我输入“10/01/2014”这样的日期时,它无法捕捉到它。