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

4

3 回答 3

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.

于 2013-10-10T20:11:33.257 回答
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控制器到目前为止对我来说工作得很好,但是如果你遇到任何问题,还有其他答案可以解决这个问题

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

于 2013-10-10T20:12:48.527 回答
0

如果您可以使用 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>
于 2013-10-11T10:37:16.767 回答