Пользовательский атрибут проверки не работает на стороне клиента
В соответствии с этим и этим постом я попытался реализовать пользовательскую проверку для большего, чем логика.
Итак, у меня есть следующий код:
public class DynamicRangeGreaterThenValidator : ValidationAttribute, IClientValidatable
{
private readonly string _minPropertyName;
public DynamicRangeGreaterThenValidator(string minPropertyName)
{
_minPropertyName = minPropertyName;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var minProperty = validationContext.ObjectType.GetProperty(_minPropertyName);
if (minProperty == null)
{
return new ValidationResult(string.Format("Unknown property {0}", _minPropertyName));
}
var minValue = (double)minProperty.GetValue(validationContext.ObjectInstance, null);
var currentValue = (double)value;
if (currentValue <= minValue)
{
return new ValidationResult(
string.Format(
ErrorMessage,
minValue
)
);
}
return null;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata,
ControllerContext context)
{
var rule = new ModelClientValidationRule
{
ValidationType = "greaterthen",
ErrorMessage = this.ErrorMessage,
};
rule.ValidationParameters["minvalueproperty"] = _minPropertyName;
yield return rule;
}
}
JavaScript:
jQuery(document).ready(function () {
jQuery.validator.unobtrusive.adapters.add(
'greaterthen',
['minvalueproperty'],
function(options) {
// simply pass the options.params here
options.rules['greaterthen'] = options.params;
options.messages['greaterthen'] = options.message;
}
);
jQuery.validator.addMethod('greaterthen', function(value, element, params) {
var minValue = parseFloat(jQuery('input[name="' + params.minvalueproperty + '"]').val(), 10);
var currentValue = parseInt(value, 10);
if (isNaN(minValue) || isNaN(currentValue) || minValue >= currentValue) {
var message = jQuery(element).attr('data-val-greaterthen');
jQuery.validator.messages.greaterthen = jQuery.format(message, minValue);
return false;
}
return true;
}, '');
});
Моя модель:
public class TestModel
{
[Required(ErrorMessageResourceType = typeof (Resource), ErrorMessageResourceName = "RequiredParameter")]
/* [Display(Name = "MinQuantity", ResourceType = typeof (Resource))]*/
public double MinQuantity { get; set; }
[Required(ErrorMessageResourceType = typeof (Resource), ErrorMessageResourceName = "RequiredParameter")]
public double MaxQuantity { get; set; }
[Required(ErrorMessageResourceType = typeof (Resource), ErrorMessageResourceName = "RequiredParameter")]
[Display(Name = "NormalQuantity", ResourceType = typeof (Resource))]
[DynamicRangeGreaterThenValidator("MinQuantity", ErrorMessage = "Value must be greater than {0}")]
public double NormalQuantity { get; set; }
}
К сожалению, этот код работает только на стороне сервера, и я не могу заставить этот код работать на стороне клиента.
Моя проблема в том, что я не нашел никаких правил для создания проверки на стороне клиента. Я не знаю, как должно быть имя адаптера и метод, чтобы заставить его работать. Пожалуйста, помогите мне с этим кодом и, если возможно, объясните, как должна работать проверка на стороне клиента.
Благодарю.