ASP .Net MVC 3: пользовательская ненавязчивая проверка - PullRequest
13 голосов
/ 12 февраля 2012

Я пытаюсь добавить настраиваемую ненавязчивую проверку в мое приложение. Кажется, он не запускает проверку.

Вот мой класс атрибутов:

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(
    ModelMetadata metadata, ControllerContext context)
{
    yield return new ModelClientValidationRule
    {
        ErrorMessage = ErrorMessage,
        ValidationType = "custrequired"
    };
}

И мой JavaScript:

$.validator.addMethod('custrequired', function(value, element, param) {
  return value && value !== '99:99' && value !== '9:99';
});

$.validator.unobtrusive.adapters.add('custrequired', null, function(options) {
  return options.messages['custrequired'] = options.message;
});

Ответы [ 3 ]

31 голосов
/ 12 февраля 2012

Есть много вещей, которые могут пойти не так, в том числе код, который вы разместили:

  • Как выглядит ваш сгенерированный HTML для <input>?Включает ли он атрибут data-val-custrequired?

  • Если нет, вы не забыли добавить интерфейс в объявлении класса - IClientValidatable?

  • Вы не забыли не добавить свой собственный валидатор в обработчик DOM ready?(т.е. не используйте $(document).ready() или $(function() { ... })) - проверка должна быть настроена до того, как документ будет готов.

ETA : причинапоследний из них заключается в том, что jquery.validate.unobtrusive делает это:

$(function () {
    $jQval.unobtrusive.parse(document);
});

Т.е. он анализирует документ на наличие проверочных атрибутов, правил и т. д. в готовом документе.Поскольку этот скрипт должен быть загружен для регистрации ваших адаптеров, ваш регистрационный скрипт обычно должен идти через после jquery.validate.unobtrusive.js.Но это также делает любой зарегистрированный обработчик .ready именуемым после «ненавязчивым» - к этому моменту уже слишком поздно.Я думаю, вы могли бы поставить свой сценарий регистрации раньше, а затем использовать .ready.Никогда не пробовал, и я никогда не видел, чтобы это было сделано.

Кроме того, в этом случае этого должно быть достаточно для регистрации адаптера:

$.validator.addMethod('custrequired', function(value, element, param) {
   return value && value !== '99:99' && value !== '9:99';
});

jQuery.validator.unobtrusive.adapters.addBool('custrequired');

Это все равно добавит любую пользовательскую ошибкусообщение, которое вы можете получить, но поскольку ваш валидатор не использует дополнительные параметры (такие как, например, StringLength pass MaximumLength и т. д.), пользовательский адаптер не требуется.

3 голосов
/ 12 февраля 2012

Есть несколько проблем с вызовом $.validator.unobtrusive.adapters.add:

$.validator.unobtrusive.adapters.add('custrequired', function (options) {
// -------------------------------------------------^ <-- removed "null" param
    options.messages['custrequired'] = options.message;
    // Register the rule properly
    options.rules['custrequired'] = options.params;
    // Don't return anything
});

После этих двух изменений (и убедившись, что ClientValidation и UnobtrusiveJavascript были включены в web.config), все заработало нормально.

0 голосов
/ 12 июня 2015

Вы должны изменить сторону сервера.

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(
    ModelMetadata metadata, ControllerContext context)
    {
      //I changed ErrorMessage for ErrorMessageString
      yield return new ModelClientValidationRule
      {
        ErrorMessage = ErrorMessageString,
        ValidationType = "custrequired"
      };
   }

А также, как сказал Андре Уитакер, вы должны указать это, чтобы добавить свою валидацию клиентской стороне.

    //i changed param for params
    $.validator.addMethod('custrequired', function(value, element, params) {
       return value && value !== '99:99' && value !== '9:99';
    });

    //i specified that there isn't paramaters using an empty array.
    $.validator.unobtrusive.adapters.add('custrequired', [] , function (options) {
        options.messages['custrequired'] = options.message;
        options.rules['custrequired'] = options.params;
    });

ПОМНИТЕ, ЧТОБЫ ПРОВЕРИТЬ HTML-ВХОД, В ЭТОМ СЛЕДУЕТ ИМЕТЬ АТРИБУТ «ДАННЫХ» С ТЕКСТОМ СООБЩЕНИЯ ОБ ОШИБКЕ

Я надеюсь, что это работает для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...