2014-09-15 4 views
1

Я пытаюсь написать очень простой Data Annotation Validator для моей модели MVC MVC MVC. Когда применяется в поле datetime, валидатор должен проверить, является ли год даты текущим годом или нет. Серверная часть работает как intented, но на сторону клиента, кажется, не вызывает (другие валидатор, как диапазон или необходимые работы)ASP.NET MVC Custom Validator не запускает

стороны сервера:

class CurrentYearAttribute : ValidationAttribute, IClientValidatable 
{ 
    public override bool IsValid(object value) 
    { 
     if(value == null) 
     { 
      return false; 
     } 

     var date = (DateTime)value; 

     return (date.Year == DateTime.Now.Year); 

    } 

    public override string FormatErrorMessage(string name) 
    { 
     return "Le champ " + name + " doit être de l'année en cours."; 
    } 

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     var rule = new ModelClientValidationRule() 
     { 
      ValidationType = "currentyear", 
      ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()), 
     }; 

     yield return rule; 

    } 
} 

сторона клиента:

<script type="text/javascript"> 
     $(document).ready(function() { 
      $.validator.addMethod(
       'currentyear', 
       function (value, element, params) { 
        alert("hello"); // never 
        return (Date.parse(value).getFullYear() == (new Date()).getFullYear()); 
       }); 

      $.validator.unobtrusive.adapters.addBool("currentyear"); 

      //$.validator.unobtrusive.parse("form"); 
     }); 
</script> 

ответ

1

Я считаю, что вам нужно позвонить $.validator.addMethod() и $.validator.unobtrusive.adapters.addBoolдо$(document).ready. Если элементы формы вставлены динамически, вам необходимо вызвать $.validator.unobtrusive.parse или $.validator.unobtrusive.parseElement на каждый элемент.

1

Проблема в том, что вы не определили часть правила вашего адаптера.

Попробуйте использовать что-то вроде этого:

$.validator.unobtrusive.adapters.addBool("currentyear", function (options) { 
    options.rules["currentyear"] = "#" + options.element.name.replace('.', '_'); // mvc html helpers 
    options.messages["currentyear"] = options.message; 
}); 

О правиле:

JQuery правила массива для этого HTML-элемента. Ожидается, что адаптер добавит в этот массив правил определенные элементы проверки подлинности jQuery Validate, которые он хочет подключить. Имя - это имя правила проверки jQuery, а значение - значения параметра для правила проверки jQuery.