2011-06-02 7 views
7

Tworzę walidator zakresu dnia za pomocą DataAnnotations, jQuery.validate i jquery.validate.unobtrusive. Ja już przeczytać: http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-validation.htmljQuery.validator.unobtrusive.adapters.addMinMax round trips, nie działa w MVC3

http://weblogs.asp.net/mikaelsoderstrom/archive/2010/10/06/unobtrusive-validation-in-asp-net-mvc-3.aspx

i inne, ale nie można ich (noob)

jak również większość postu na SO pisać. Ja baning głowę o ścianę, każda pomoc może być rewardde z piwem/Żywność/kod/etc;) W każdym razie oto kod:

Mam modelu obiektu z następującym parametrem:

[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 jest klasa atrybut niestandardowy:

[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; 
    } 
} 

mam następujących w moim web.config:

<appSettings> 
    <add key="ClientValidationEnabled" value="true"/> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/> 
</appSettings> 

mam mieć następującą JS spust zanim dokument jest gotowy (próbowałem wyzwalania gdy doc jest gotowy zbyt):

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'); 

Co robię źle? Z góry dziękuję, Jol

Odpowiedz

19

rozwiązany! Zapomniałem/nie zrozumiałem, że musisz sam przekazać jQuery do zamknięcia funkcji. Dlatego zwyczaj Walidator po stronie klienta powinna wyglądać następująco:

$(function() { 
    jQuery.validator.addMethod('dayRange', function (value, element, param) { 
     if (!value) return false; 
     var valueDateParts = value.split(param.seperator); 
     var minDate = new Date(); 
     var maxDate = new Date(); 
     var now = new Date(); 
     var dateValue = new Date(valueDateParts[2], 
          (valueDateParts[1] - 1), 
          valueDateParts[0], 
          now.getHours(), 
          now.getMinutes(), 
          (now.getSeconds()+5)); 

     minDate.setDate(minDate.getDate() - parseInt(param.min)); 
     maxDate.setDate(maxDate.getDate() + parseInt(param.max)); 

    return dateValue >= minDate && dateValue <= maxDate; 
}); 

    jQuery.validator.unobtrusive.adapters.add('dayrange', ['min', 'max', 'dateseperator'], function (options) { 
     var params = { 
      min: options.params.min, 
      max: options.params.max, 
      seperator: options.params.dateseperator 
     }; 

     options.rules['dayRange'] = params; 
     if (options.message) { 
      options.messages['dayRange'] = options.message; 
     } 
    }); 
}(jQuery)); 

ja również zmienić sposób mogę dodać kartę do dyskretny, więc mogę dodać dodatkowe właściwości. Nigdy nie wysyłaj do dev po stronie serwera, aby wykonywać pracę inżynierów front-end;) Mam nadzieję, że to pomaga komuś.

+1

pomógł mi! dzięki :-) – Peter

+0

Przyjemność mate. Zajęło mi godziny, aby stwierdzić, że "(jQuery)" brakowało na końcu, mam nadzieję, że nie skończyło ci się poświęcanie tak dużo czasu. – jolySoft

+0

Szukałem, jak zbudować niestandardową funkcję sprawdzania poprawności za pomocą walidacji jquery, do której można przekazywać parametry. I dałeś mi dobry przykład! – Peter

2

referencyjny: http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-validation.html

adapters.addMinMax() „s param jest orderby to:

adapterName, minRuleName, maxRuleName, minMaxRuleName, minAttribute, maxAttribute 

więc trzeba to:

jQuery.validator.unobtrusive.adapters.addMinMax('dayrange', '', '', 'dayrange','minlength', 'maxlength'); 

AND,,, 

param.min, param.max be sure to undefine. param is an purely array as: ['111','000']. 

więc trzeba:

var minDate = now.setDate(now.getDate() - param[0]); 
var maxDate = now.setDate(now.getDate() + param[1]);