有没有人看到一个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"); } }