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