2011-06-02 7 views
7

Estoy creando un validador de rango de día usando DataAnnotations, jQuery.validate y jquery.validate.unobtrusive. Ya he leído lo siguiente: http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-validation.htmljQuery.validator.unobtrusive.adapters.addMinMax ida y vuelta, no funciona en MVC3

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

y otra, pero no puede publicarlos (novato)

Así como la mayor parte del mensaje el SO. Estoy Baning la cabeza contra una pared, cualquier ayuda podría rewardde con cerveza/comida/código/etc;) De todos modos aquí está el código:

Tengo un objeto de modelo con el siguiente parámetro:

[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 es una clase de atributo personalizado:

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

tengo el siguiente en mi web.config:

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

He tienen siguiente trigger JS antes de que el documento está listo (tratado de disparo cuando el documento está listo también):

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

¿Qué estoy haciendo mal? Gracias de antemano, Jol

Respuesta

19

resuelto! Olvidé/no entendí que tienes que pasar jQuery en el cierre de la función. Por tanto, el validador personalizado en el cliente debe tener este aspecto:

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

también puedo cambiar la forma en que añado el adaptador al discreta para que pueda agregar propiedades adicionales. Nunca lo envíe al desarrollador del lado del servidor para hacer un trabajo de ingenieros de front-end;) Espero que esto ayude a alguien.

+1

me ayudó! gracias :-) – Peter

+0

Placer de placer. Me tomó horas encontrar que '(jQuery)' faltaba al final, espero que no hayas tomado tanto tiempo. – jolySoft

+0

Estaba buscando cómo crear una función de validación personalizada utilizando la validación de jquery a la que puede pasar parámetros. ¡Y me has dado un buen ejemplo! – Peter

2

Referencia: parámetro http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-validation.html

adapters.addMinMax() 's es OrdenarPor esto:

adapterName, minRuleName, maxRuleName, minMaxRuleName, minAttribute, maxAttribute 

por lo que necesita esto:

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

por lo que necesita:

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