2011-06-02 13 views
7

sto creando una gamma giorno validatore usando DataAnnotations, jQuery.validate e jquery.validate.unobtrusive. Ho già letto il seguente: http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-validation.htmljQuery.validator.unobtrusive.adapters.addMinMax andata e ritorno, non funziona in MVC3

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

e altri, ma non li (niubbo)

Così come la maggior parte dei post su SO poter postare. Sto Baning la testa contro un muro, qualsiasi aiuto potrebbe essere rewardde con la birra/cibo/code/etc;) Comunque ecco il codice:

Ho un oggetto modello con il seguente parametro:

[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 è una classe attributo personalizzato:

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

ho la seguente nel mio web.config:

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

Ho avere seguito grilletto JS prima che il documento è pronto (ho provato innescando quando il documento è pronto troppo):

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

Che cosa sto facendo di sbagliato? Grazie in anticipo, Jol

risposta

19

Risolto! Ho dimenticato/non ho capito che devi passare jQuery stesso alla chiusura della funzione. Pertanto il validatore personalizzato sul lato client dovrebbe essere simile a questo:

$(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)); 

ho anche cambiare il modo in cui aggiungo l'adattatore al discreto in modo da poter aggiungere ulteriori proprietà. Non inviare mai a dev del lato server per fare un lavoro di front-end ingegnere;) Spero che questo aiuti qualcuno.

+1

mi ha aiutato! grazie :-) – Peter

+0

Compagno di piacere. Mi ci sono voluti ore per scoprire che '(jQuery)' mancava alla fine, spero che tu non abbia finito per prendere tutto il tempo. – jolySoft

+0

Stavo cercando come creare una funzione di convalida personalizzata usando la convalida jquery a cui è possibile passare i parametri. E tu mi hai fornito un buon esempio! – Peter

2

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

s' adapters.addMinMax() param è orderby questo:

adapterName, minRuleName, maxRuleName, minMaxRuleName, minAttribute, maxAttribute 

in modo avete bisogno di questo:

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']. 

quindi è necessario:

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