2013-10-10 192 views
1

我已经有了一个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提供了一个内置的方式做到这一点?

回答

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

+0

我试图左右逢源,保持相同的类和方法的名字从你的榜样,但是当我输入的日期,如“10/01/2014“,它没有抓住它。 – SantasNotReal

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的答案创建自己的属性可能会更好也更容易,但是如果您需要任何进一步和/或更复杂的逻辑甚至涉及其他班级成员,那么IValidatableObject是内置的方式。

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> 
相关问题