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

Проверка на стороне клиента ASP.NET MVC 3 с параметрами

После этого сообщения Выполните проверку на стороне клиента для настраиваемого атрибута

Я пытаюсь понять, как это сделать, передавая дополнительные параметры клиентской стороне script

Насколько я понимаю до сих пор, чтобы выполнить выборочную проверку с помощью MVC 3, требуется следующее

Создать собственный атрибут проверки

На основе ValidationAttribute и реализации IClientValidatable. Я также вижу некоторые примеры из ModelValidator, которые, как представляется, реализуют функциональность как ValidationAttribute, так и IClientValidatable. Итак, это мой первый момент путаницы в отношении того, что такое diffirences или ModelValidator использовался в MVC 2, но теперь он устарел или что?

Экземпляр ModelClientValidationRule должен быть возвращен из GetClientValidationRules(), чтобы указать такие данные, как сообщение об ошибке, ValidationType (который я понимаю как имя функции Javascript, которая будет выполнять проверку на стороне клиента) и любые дополнительные пользовательские параметры что атрибут может иметь, и что необходимо передать на проверку Javascript.

Я предполагаю, что среда выполнения (не уверен, какая ее часть) использует ModelClientValidationRule для генерации атрибута html в элементах тега следующим образом:

data-val="true"  (to indicate that the element requires validation)
data-val-[ValidationType]=[ErrorMessage]
data-val-[ValidationType].[ValidationParameters(n).Key]=[ValidationParameters(n).Value]

Реализация клиентской логики проверки

Функция javascript должна быть создана и добавлена ​​в jQuery.validators с jQuery.validators.addmethod(), чтобы JQuery знал об этом, когда это нужно выполнить. Что-то вроде:

jQuery.validator.addMethod(
    'greaterThan', 
    function (value, element, params) {
        /.../
       return /* true or false   */ ; 
    },
    ''
); 

Мой вопрос здесь в том, является ли функция подписи (value, element, params) стандартным для методов, которые будут обрабатывать проверку, и я предполагаю, что она будет вызвана некоторыми функциями jQuery в соответствующее время, например, перед отправкой формы или когда элемент теряет fuces или события keyUp. Я просто не согласен с тем, как вы можете контролировать это, то есть выберите, какое событие является подходящим для вашей пользовательской проверки.

Внедрить ненавязчивый адаптер

Это переводит ненавязчивые атрибуты; что-то я не очень понимаю, но предполагаю, что это правило jQuery, но я не понимаю, как это работает. Что-то вроде

jQuery.validator.unobtrusive.adapters.add(
    'futuredate', 
    { },
    function (options) {
        options.rules['greaterThan'] = true;
        options.messages['greaterThan'] = options.message;
    }
); 

Мой вопрос здесь о 'function (options)'. Является ли это функцией, которая будет вызываться до "function (value, element, params)" и отвечает за извлечение ненавязчивых тегов в структуру данных, которая может быть понята jQuery.Validation. Из примера кода мне кажется, что параметры - это объект, который содержит оба значения атрибута из тега (например, options.message) и соответствующие свойства jQuery, на которые он должен сопоставляться (например, options.messages ['ClientSideValidationFunctionName'] Если это так, как настраиваемые параметры извлекаются и отображаются.

Надеюсь, я не добавил никаких дополнительных замешательств.

4b9b3361

Ответ 1

Вы можете использовать свойство ValidationParameters для добавления в это правило настраиваемых параметров:

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
    var rule = new ModelClientValidationRule
    {
        ErrorMessage = this.ErrorMessage,
        ValidationType = "futuredate",
    };
    rule.ValidationParameters.Add("param1", "value1");
    rule.ValidationParameters.Add("param2", "value2");
    yield return rule;
}

который может быть использован в адаптере:

jQuery.validator.unobtrusive.adapters.add(
    'futuredate', 
    [ 'param1', 'param2' ],
    function (options) {
        var param1 = options.params.param1; // shall equal 'value1'
        var param2 = options.params.param2; // shall equal 'value2'
        // TODO: use those custom parameters to define the client rules
    }
);

UPDATE:

Как указано в разделе комментариев здесь, как вы можете передать эти параметры в пользовательскую функцию правила проверки:

jQuery.validator.unobtrusive.adapters.add(
    'futuredate', 
    [ 'param1', 'param2' ],
    function (options) {
        // simply pass the options.params here
        options.rules['greaterThan'] = options.params;
        options.messages['greaterThan'] = options.message;
    }
);

jQuery.validator.addMethod('greaterThan', function (value, element, params) {
    // params here will equal { param1: 'value1', param2: 'value2' }
    return ...
}, '');