Ненавязчивые атрибуты данных проверки клиента не отображаются для вложенных правил свойств

Используя 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.

Надеюсь, это поможет кому-то сэкономить время;-)

Другие вопросы по тегам