I am creating a daily range validator using DataAnnotations, jQuery.validate and jquery.validate.unobtrusive. I already read the following: http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-validation.html
http://weblogs.asp.net/mikaelsoderstrom/archive/2010/10/06/unobtrusive-validation-in-asp-net-mvc-3.aspx
and others, but cannot publish them (noob)
Like most posts on SO. I forbid my head against the wall, any help can be rewarded with beer / food / code / etc .;) In any case, the code here:
I have a model object with the following parameter:
[Display(Name = "Start date"), DayRange(0, 5, ErrorMessage = "The Start Date must be between today and 5 days time.")] public DateTime StartDate { get; set; }
DayRange is a custom attribute class:
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)] public class DayRangeAttribute : RangeAttribute, IClientValidatable { private int _minimumDays; private int _maximumDays; public DayRangeAttribute(int minimumDays, int maximumDays) : base(minimumDays, maximumDays) { _minimumDays = minimumDays; _maximumDays = maximumDays; } public override bool IsValid(object value) { var dateToBeTested = value as DateTime?; return dateToBeTested.HasValue && dateToBeTested.Value >= DateTime.Today.AddDays(_minimumDays) && dateToBeTested.Value <= DateTime.Today.AddDays(_maximumDays); } public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { var rule = new ModelClientValidationRule { ErrorMessage = this.ErrorMessage, ValidationType = "dayrange" }; rule.ValidationParameters.Add("min", _minimumDays); rule.ValidationParameters.Add("max", _maximumDays); yield return rule; } }
In my web.config there is the following:
<appSettings> <add key="ClientValidationEnabled" value="true"/> <add key="UnobtrusiveJavaScriptEnabled" value="true"/> </appSettings>
I have the following JS trigger before the document is ready (tried to run it when the document is ready too):
jQuery.validator.addMethod('dayrange', function (value, element, param) { if (!value) return false; var now = Date(); var dateValue = Date.parse(value); var minDate = now.setDate(now.getDate() - param.min); var maxDate = now.setDate(now.getDate() + param.max); return this.optional(element) && dateValue >= minDate && dateValue <= maxDate; }, 'Must fall in range'); jQuery.validator.unobtrusive.adapters.addMinMax('dayrange', 'minlength', 'maxlength', 'dayrange');
What am I doing wrong? Thanks in advance, Jol