2013-10-10 185 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> 
相關問題