有没有人看到一个MVC3数据注释的日期验证,需要一个选定的日期等于或大于当前日期?
如果已经有第三方添加了很酷。我已经在使用DataAnnotationsExtensions,但不提供我正在寻找的内容。
这似乎没有任何参考。所以,希望有人已经解决了这个问题,然后再尝试重新创造轮子,并写下自己的定制验证器。
我已经尝试了Range,但需要2个日期,并且都必须是字符串格式的常量,例如[Range(typeof(DateTime),“1/1/2011”,“1/1/2016”)]帮助。而DataAnnotationsExtensions Min验证器只接受int和double
更新已解决
感谢@BuildStarted这是我结束了,它的工作伟大的服务器端,现在客户端与我的脚本
- using System;
- using System.Collections.Generic;
- using System.ComponentModel.DataAnnotations;
- using System.Web.Mvc;
- namespace Web.Models.Validation {
- [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property,AllowMultiple = false,Inherited = true)]
- public sealed class DateMustBeEqualOrGreaterThanCurrentDateValidation : ValidationAttribute,IClientValidatable {
- private const string DefaultErrorMessage = "Date selected {0} must be on or after today";
- public DateMustBeEqualOrGreaterThanCurrentDateValidation()
- : base(DefaultErrorMessage) {
- }
- public override string FormatErrorMessage(string name) {
- return string.Format(DefaultErrorMessage,name);
- }
- protected override ValidationResult IsValid(object value,ValidationContext validationContext) {
- var dateEntered = (DateTime)value;
- if (dateEntered < DateTime.Today) {
- var message = FormatErrorMessage(dateEntered.ToShortDateString());
- return new ValidationResult(message);
- }
- return null;
- }
- public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata Metadata,ControllerContext context) {
- var rule = new ModelClientCustomDateValidationRule(FormatErrorMessage(Metadata.DisplayName));
- yield return rule;
- }
- }
- public sealed class ModelClientCustomDateValidationRule : ModelClientValidationRule {
- public ModelClientCustomDateValidationRule(string errorMessage) {
- ErrorMessage = errorMessage;
- ValidationType = "datemustbeequalorgreaterthancurrentdate";
- }
- }
- }
在我的模特儿
- [required]
- [DateMustBeEqualOrGreaterThanCurrentDate]
- public DateTime SomeDate { get; set; }
客户端脚本
- /// <reference path="jquery-1.7.2.js" />
- jQuery.validator.addMethod("datemustbeequalorgreaterthancurrentdate",function (value,element,param) {
- var someDate = $("#SomeDate").val();
- var today;
- var currentDate = new Date();
- var year = currentDate.getYear();
- var month = currentDate.getMonth() + 1; // added +1 because javascript counts month from 0
- var day = currentDate.getDate();
- var hours = currentDate.getHours();
- var minutes = currentDate.getMinutes();
- var seconds = currentDate.getSeconds();
- today = month + '/' + day + '/' + year + ' ' + hours + '.' + minutes + '.' + seconds;
- if (someDate < today) {
- return false;
- }
- return true;
- });
- jQuery.validator.unobtrusive.adapters.addBool("datemustbeequalorgreaterthancurrentdate");
解决方法
创建自定义属性。
- public class CheckDateRangeAttribute: ValidationAttribute {
- protected override ValidationResult IsValid(object value,ValidationContext validationContext) {
- DateTime dt = (DateTime)value;
- if (dt >= DateTime.UtcNow) {
- return ValidationResult.Success;
- }
- return new ValidationResult(ErrorMessage ?? "Make sure your date is >= than today");
- }
- }