Проверьте это тоже:
Полное руководство по проверке в ASP.NET MVC 3 - Часть 2
Основные части статьи следуют (вставлено в копию)).
Создание полнофункционального пользовательского валидатора, работающего как на клиенте, так и на сервере, состоит из четырех отдельных частей.Сначала мы создаем подкласс ValidationAttribute
и добавляем нашу логику проверки на стороне сервера.Затем мы реализуем IClientValidatable
в нашем атрибуте, чтобы позволить атрибутам HTML5 data-*
передаваться клиенту.В-третьих, мы пишем пользовательскую функцию JavaScript, которая выполняет проверку на клиенте.Наконец, мы создаем адаптер для преобразования атрибутов HTML5 в формат, понятный нашей пользовательской функции.Хотя это звучит как большая работа, как только вы начнете, вы найдете это относительно просто.
Подклассификация ValidationAttribute
В этом примере мы напишемСредство проверки NotEqualTo, которое просто проверяет, что значение одного свойства не равно значению другого.
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public sealed class NotEqualToAttribute : ValidationAttribute
{
private const string DefaultErrorMessage = "{0} cannot be the same as {1}.";
public string OtherProperty { get; private set; }
public NotEqualToAttribute(string otherProperty)
: base(DefaultErrorMessage)
{
if (string.IsNullOrEmpty(otherProperty))
{
throw new ArgumentNullException("otherProperty");
}
OtherProperty = otherProperty;
}
public override string FormatErrorMessage(string name)
{
return string.Format(ErrorMessageString, name, OtherProperty);
}
protected override ValidationResult IsValid(object value,
ValidationContext validationContext)
{
if (value != null)
{
var otherProperty = validationContext.ObjectInstance.GetType()
.GetProperty(OtherProperty);
var otherPropertyValue = otherProperty
.GetValue(validationContext.ObjectInstance, null);
if (value.Equals(otherPropertyValue))
{
return new ValidationResult(
FormatErrorMessage(validationContext.DisplayName));
}
}
return ValidationResult.Success;
}
}
Добавьте новый атрибут в свойство пароля в RegisterModel и запустите приложение.
[Required]
[DataType(DataType.Password)]
[Display(Name = "Password")]
[NotEqualTo("UserName")]
public string Password { get; set; }
...
Реализация IClientValidatable
В ASP.NET MVC 2 был механизм для добавления проверки на стороне клиента, но он был не очень хорош.К счастью, в MVC 3 все улучшилось, и процесс теперь довольно тривиален, и, к счастью, не включает в себя изменение Global.asax
, как в предыдущей версии.
Первый шаг для вашего пользовательскогоАтрибут проверки для реализации IClientValidatable.Это простой интерфейс с одним методом:
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(
ModelMetadata metadata,
ControllerContext context)
{
var clientValidationRule = new ModelClientValidationRule()
{
ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
ValidationType = "notequalto"
};
clientValidationRule.ValidationParameters.Add("otherproperty", OtherProperty);
return new[] { clientValidationRule };
}
Если вы запустите приложение сейчас и просмотрите исходный код, вы увидите, что html для ввода пароля теперь содержит ваши notequalto
атрибуты данных:
<div class="editor-field">
<input data-val="true" data-val-notequalto="Password cannot be the same as UserName."
data-val-notequalto-otherproperty="UserName"
data-val-regex="Weak password detected."
data-val-regex-pattern="^(?!password$)(?!12345$).*"
data-val-required="The Password field is required."
id="Password" name="Password" type="password" />
<span class="hint">Enter your password here</span>
<span class="field-validation-valid" data-valmsg-for="Password"
data-valmsg-replace="true"></span>
</div>
Создание пользовательской функции проверки jQuery
Весь этот код лучше всего помещать в отдельный файл JavaScript.
(function ($) {
$.validator.addMethod("notequalto", function (value, element, params) {
if (!this.optional(element)) {
var otherProp = $('#' + params);
return (otherProp.val() !=
}
return true;
});
$.validator.unobtrusive.adapters.addSingleVal("notequalto", "otherproperty");
}(jQuery));
В зависимости от вашей проверкитребования, вы можете обнаружить, что библиотека jquery.validate уже имеет код, необходимый для самой проверки.В jquery.validate есть много валидаторов, которые не были реализованы или сопоставлены с аннотациями данных, поэтому, если они удовлетворяют вашим потребностям, все, что вам нужно написать в javascript, - это адаптер или даже вызов встроенного адаптера, который можетбыть всего лишь одной строкой.Загляните внутрь jquery.validate.js , чтобы узнать, что доступно.
Использование существующего адаптера jquery.validate.unobtrusive
Работа адаптера заключается в чтении атрибутов HTML5 data-*
в элементе формы и преобразовании этих данных в форму, понятную для jquery.validate и вашей пользовательской функции проверки.Вы не обязаны выполнять всю работу самостоятельно, хотя во многих случаях вы можете вызвать встроенный адаптер.jquery.validate.unobtrusive объявляет три встроенных адаптера, которые могут использоваться в большинстве ситуаций.Это:
jQuery.validator.unobtrusive.adapters.addBool - used when your validator does not need any additional data.
jQuery.validator.unobtrusive.adapters.addSingleVal - used when your validator takes in one piece of additional data.
jQuery.validator.unobtrusive.adapters.addMinMax - used when your validator deals with minimum and maximum values such as range or string length.
Если ваш валидатор не входит ни в одну из этих категорий, вы должны написать свой собственный адаптер, используя метод jQuery.validator.unobtrusive.adapters.add
.Это не так сложно, как кажется, и мы увидим пример позже в этой статье.
Мы используем метод addSingleVal
, передавая имя адаптера и имя единственного значения, которое мыхочу пройти.Если имя функции проверки отличается от адаптера, вы можете передать третий параметр (ruleName
):
jQuery.validator.unobtrusive.adapters.addSingleVal("notequalto", "otherproperty", "mynotequaltofunction");
На этом этапе наш пользовательский валидатор завершен.
Для лучшего понимания обратитесь к самой статье , в которой представлено более подробное описание и более сложный пример.
HTH.