Подтвердить что ты не робот

ASP.Net MVC 3: выборочная ненавязчивая проверка

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

Вот мой класс Attribute:

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;
});
4b9b3361

Ответ 1

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

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

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

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

ETA. Причина последнего заключается в том, что jquery.validate.unobtrusive делает следующее:

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

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

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

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

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

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

Ответ 2

Есть несколько проблем с вызовом $.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), все работает нормально.

Ответ 3

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

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

ПОМНИТЕ, ЧТОБЫ ПРОВЕРИТЬ БЛОК ВХОДА, ЭТО ДОЛЖНО ИМЕЕТСЯ "АТРИБУТИРУЕМЫЙ" АТРИБУТИЙ "С ТЕКСТОМ СООБЩЕНИЯ ОШИБКИ

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