Ненавязчивые атрибуты данных проверки клиента не отображаются для вложенных правил свойств
Используя FluentValidation 4.4, следующие правила выдают правильные ненавязчивые атрибуты данных проверки в полях ввода:
RuleFor(e => e.PrimaryContact).NotEmpty();
рендеринг следующего HTML:
<input class="text-box single-line k-textbox input-validation-error"
data-val="true" data-val-required="'Primary Contact' should not be empty."
id="PrimaryContact" name="PrimaryContact" type="text" value="">
Однако правило с вложенным свойством не создает никаких атрибутов данных проверки:
RuleFor(e => e.Company.Name).NotEmpty();
рендеринг следующего HTML:
<input class="text-box single-line k-textbox" id="Company_Name" name="Company.Name" type="text" value="">
Что мне не хватает?
2 ответа
Это может быть немного небрежно в случае, если вам нужно проверить каждое свойство в дочернем объекте. Я бы порекомендовал делать то, что они имеют в своей документации здесь.
[Validator(typeof(ParentObjectValidator))]
public class ParentObject
{
public string PrimaryContact {get;set;}
public Company Company {get;set;}
}
[Validator(typeof(CompanyValidator))] // This one is required!
// Otherwise no data-val-required will be assigned
public class Company
{
public string Name {get;set;}
}
Установите валидатор для дочернего объекта.
public class CompanyValidator : AbstractValidator<Company> {
public CompanyValidator() {
RuleFor(company => company.Name).NotEmpty();
//etc
}
}
Затем в родительском объекте вы можете установить этот валидатор на дочерний объект следующим образом.
public class ParentObjectValidator : AbstractValidator<ParentObject> {
public ParentObjectValidator() {
RuleFor(e => e.PrimaryContact).NotEmpty();
RuleFor(e => e.Company).SetValidator(new CompanyValidator());
}
}
Это должно указать вам в правильном направлении!
У меня уже есть такая же проблема, как "jrummel"!!!
Если я определю Validator с помощью SetValidator для моего вложенного объекта ViewModel, метод MVC EditorForFor не будет отображать никаких атрибутов data-val*. И поэтому проверка на стороне клиента не сработала...
Но любое другое свойство (которое не является вложенным или вложенным viewModelType) работает очень хорошо. Входные данные имеют атрибуты data-val*. -> WTF?
После того, как я нашел http://www.paraesthesia.com/archive/2013/04/17/fluentvalidation-and-mvc-from-server-to-client.aspx и понял, как работает механизм проверки, я понял, что Я скучаю по [Validator(typeof(MyNestedViewModelType))]
Атрибут класса MyNestedViewModelType.
Надеюсь, это поможет кому-то сэкономить время;-)