Я полагаю, что вы уже следовали инструкциям Фила Хаака http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx) о том, как получить пользовательскую проверку при работе с проверкой клиента MS AJAX. Чтобы он работал с jQuery, вам нужно изменить файл MicrosoftMvcJQueryValidation.js:
В функции __MVC_CreateRulesForField (validationField) вам необходимо добавить оператор case. Продолжая пример Фила, вам нужно добавить:
чехол "цена":
__ MVC_ApplyValidator_Price (rulesObj, thisRule.ValidationParameters ["min"]);
перерыв;
Затем вам нужно будет создать функцию __MVC_ApplyValidator_Price:
функция __MVC_ApplyValidator_Price (объект, значение) {
// min is what jQuery Validate uses to validate for minimum values
object["min"] = value;
}
Этого должно быть достаточно, чтобы пример Фила работал.
Теперь, что касается вашей проверки PropertiesMustMatchAttribute, не похоже, что MVC генерирует определение проверки JSON на стороне клиента для атрибутов, которые украшают классы. Поскольку PropertiesMustMatchAttribute должен использоваться в модели (а не в свойстве), я не могу понять, как заставить его запускать проверку на стороне клиента. Вместо этого я выбрал другой подход. Я создал фиктивный атрибут проверки, перегрузка которого IsValid () всегда возвращает true, и использовал этот атрибут в свойстве. Это просто фиктивный атрибут, который делегирует логику валидации в функцию equalTo валидатора jQuery. Вот фиктивный атрибут:
public class PropertiesMustMatchClientTriggerAttribute : ValidationAttribute
{
public string MatchProperty { get; set; }
public PropertiesMustMatchClientTriggerAttribute(string matchProperty)
{
MatchProperty = matchProperty;
ErrorMessage = "{0} doesn't match {1}.";
}
public override bool IsValid(object value)
{
return true;
}
public override string FormatErrorMessage(string name)
{
return String.Format(CultureInfo.CurrentCulture, ErrorMessageString, name, MatchProperty);
}
}
Вот пользовательский валидатор:
public class PropertiesMustMatchClientTriggerValidator : DataAnnotationsModelValidator<PropertiesMustMatchClientTriggerAttribute>
{
private string _message;
private string _matchProperty;
public PropertiesMustMatchClientTriggerValidator(ModelMetadata metaData, ControllerContext context, PropertiesMustMatchClientTriggerAttribute attribute)
: base(metaData, context, attribute)
{
_message = attribute.FormatErrorMessage(metaData.DisplayName);
_matchProperty = attribute.MatchProperty;
}
public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
{
var rule = new ModelClientValidationRule
{
ErrorMessage = _message,
ValidationType = "equalTo"
};
rule.ValidationParameters.Add("matchField", _matchProperty);
return new[] { rule };
}
}
указанный пользовательский валидатор должен быть зарегистрирован в Application_Start () для блога Фила:
DataAnnotationsModelValidatorProvider.RegisterAdapter (typeof (PropertiesMustMatchClientTriggerAttribute), typeof (PropertiesMustMatchClientTriggerValidator));
Наконец, вам нужно изменить файл MicrosoftMvcJQueryValidation.js:
- Добавьте следующий оператор case в __MVC_CreateRulesForField:
case "equalTo":
__ MVC_ApplyValidator_EqualTo (rulesObj, thisRule.ValidationParameters ["matchField"]);
перерыва;
function __MVC_ApplyValidator_EqualTo (object, elemId) {
object["equalTo"] = document.getElementById(elemId);
}
Теперь вам нужно прикрепить фиктивный атрибут проверки к свойству:
[PropertiesMustMatchClientTrigger("Password")]
public string ConfirmPassword { get; set; }
Это должно сделать это.
Создание этого фиктивного атрибута немного уродливо, поэтому я надеюсь, что кто-то может найти более элегантное решение.