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;
});
Ответы
Ответ 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;
});
ПОМНИТЕ, ЧТОБЫ ПРОВЕРИТЬ БЛОК ВХОДА, ЭТО ДОЛЖНО ИМЕЕТСЯ "АТРИБУТИРУЕМЫЙ" АТРИБУТИЙ "С ТЕКСТОМ СООБЩЕНИЯ ОШИБКИ
Я надеюсь, что это сработает для вас.