ASP.NET MVC 3 проверка на стороне клиента с параметрами - PullRequest
54 голосов
/ 24 января 2011

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

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

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

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

На основе атрибута Validation и реализации IClientValidatable. Я также видел несколько примеров, полученных из ModelValidator, который, кажется, реализует функциональность как ValidationAttribute, так и IClientValidatable. Так что это моя первая путаница в отношении различий или того, использовался ли 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   */ ; 
    },
    ''
); 

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

Надеюсь, я не добавил никакой дополнительной путаницы.

1 Ответ

66 голосов
/ 24 января 2011

Вы можете использовать свойство 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 ...
}, '');
...