Перевірте це теж:
Повний посібник із перевірки в ASP.NET MVC 3 - Частина 2
Основні частини статті слідують (скопійовані).
Існує чотири окремі частини створення повнофункціонального спеціального валідатора, який працює як на клієнті, так і на сервері. Спочатку ми підкласуємо ValidationAttribute
та додаємо логіку перевірки на стороні сервера. Далі ми реалізуємо IClientValidatable
наш атрибут, щоб дозволити data-*
передавати атрибути HTML5 клієнту. По-третє, ми пишемо власну функцію 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
Завданням адаптера є зчитування data-*
атрибутів HTML5 у вашому елементі форми та перетворення цих даних у форму, яку можна зрозуміти за допомогою 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.