ASP.NET MVC 3 проверка на стороне клиента с параметрами
Исходя из этого поста Выполните проверку на стороне клиента для пользовательского атрибута
Я пытаюсь понять, как это сделать, передавая дополнительные параметры клиентскому сценарию.
Насколько я понимаю, для реализации пользовательской проверки с помощью 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 */ ;
},
''
);
Мой вопрос здесь заключается в том, является ли подпись "функция (значение, элемент, параметры)" стандартной для методов, которые будут обрабатывать проверку, и я предполагаю, что она будет вызываться некоторыми функциями 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 ответ
Вы могли бы использовать 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
}
);
ОБНОВИТЬ:
В соответствии с запросом в разделе комментариев, вот как вы можете передать эти параметры в функцию пользовательского правила валидатора:
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 ...
}, '');