Dưới đây là cách thức tiến hành:
Bắt đầu bằng cách định nghĩa các thuộc tính xác nhận tùy chỉnh:
public class FutureDateAttribute : ValidationAttribute, IClientValidatable
{
public override bool IsValid(object value)
{
if (value == null || (DateTime)value < DateTime.Now)
return false;
return true;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRule
{
ErrorMessage = this.ErrorMessage,
ValidationType = "futuredate"
};
}
}
Thông báo nó như thế nào thực hiện IClientValidatable. Tiếp theo chúng ta viết mô hình của chúng tôi:
public class MyViewModel
{
[FutureDate(ErrorMessage = "Should be in the future")]
public DateTime Date { get; set; }
}
Sau đó, một bộ điều khiển:
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new MyViewModel
{
// intentionally put in the past
Date = DateTime.Now.AddDays(-1)
});
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
return View(model);
}
}
và cuối cùng là một cái nhìn:
@using (Html.BeginForm())
{
@Html.LabelFor(x => x.Date)
@Html.TextBoxFor(x => x.Date)
@Html.ValidationMessageFor(x => x.Date)
<input type="submit" value="OK" />
}
Phần cuối cùng cho sự kỳ diệu xảy ra là xác định adapter tùy chỉnh :
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
<script type="text/javascript">
// we add a custom jquery validation method
jQuery.validator.addMethod('greaterThan', function (value, element, params) {
if (!/Invalid|NaN/.test(new Date(value))) {
return new Date(value) > new Date($(params).val());
}
return isNaN(value) && isNaN($(params).val()) || (parseFloat(value) > parseFloat($(params).val()));
}, '');
// and an unobtrusive adapter
jQuery.validator.unobtrusive.adapters.add('futuredate', { }, function (options) {
options.rules['greaterThan'] = true;
options.messages['greaterThan'] = options.message;
});
</script>
Nguồn
2011-01-20 13:05:30
Câu trả lời tuyệt vời! – raklos
Hầu hết hoạt động - định dạng ngày phải là ngày nào? – raklos
@raklos, sẽ phụ thuộc vào cài đặt bản địa hóa của trình duyệt và máy chủ. Nếu bạn có những điều khác biệt trở nên phức tạp vì một định dạng có thể vượt qua xác thực ứng dụng khách nhưng không thể xác thực máy chủ và ngược lại. Ngoài ra, bạn cũng có thể quyết định định dạng của mình vào ngày tháng. –