Сообщение Fluent Validation Complex Property показывает в нем имя сложного свойства

Привет, у меня есть структура класса, как это

public class Order
{
   public Address OfficeAddress {get;set;}
}

public class Address
{
  public string ID {get;set;}
  public string Street1 {get;set;}
  public string street2 {get;set;}
  public string City {get;set;}
  public string State {get;set;}
  public string ZipCode {get;set;}
}

У меня есть валидатор для заказа, как показано ниже

public OrderValidator : AbstractValidator<Order>
{
  public OrderValidator()
  {
        Custom(Order =>
        {
            //Did some custom validation...works fine.
        });

    RuleFor(o => o.OfficeAddress.StreetLine1)
                 .Cascade(CascadeMode.StopOnFirstFailure)
                 .NotEmpty().WithLocalizedMessage(() => Myresource.required)
                 .Length(1, 60).WithLocalizedMessage(() => Myresource.maxLength)
                 .Unless(o => null == o.OfficeAddress);
  }
}

Мое сообщение выглядит так

 Office Address. Street Line1 is required

почему он добавляет «Адрес офиса» и почему он разделил имена свойств? Сообщение о моих ресурсах похоже на то, что требуется {PropertyName}. Теперь, как я могу сказать, чтобы он не показывал мне «Адрес офиса» и не разделял его.

У меня есть аналогичные сложные свойства адреса в других представлениях, но там все работает нормально, и я не уверен, почему. Единственное отличие состоит в том, что все другие валидаторы имеют определенный набор правил, и внутри них я проверяю адрес аналогично, но здесь выше этого нет в наборе правил. Здесь для этого представления в методе Post Action контроллера я даже не упомянул [CustomizeValidator(RuleSet = "RuleSetName")], поскольку у меня есть пользовательская проверка выше. Не уверен, что это проблема.

Даже если я решу использовать RuleSet, могу ли я иметь «RuleSet», а также пользовательский валидатор в одном валидаторе? если да, то что я должен назвать RuleSet как "Адрес"? и отметьте метод действия с тем же именем, и он будет вызывать как пользовательский, так и «адресный» набор правил?


person user2232861    schedule 21.06.2013    source источник


Ответы (1)


Вы должны определить отдельный валидатор для класса Address:

public class AddressValidator: AbstractValidator<Address>
{
    public void AddressValidator()
    {
        this
            .RuleFor(o => o.StreetLine1)
            .Cascade(CascadeMode.StopOnFirstFailure)
            .NotEmpty().WithLocalizedMessage(() => Myresource.required)
            .Length(1, 60).WithLocalizedMessage(() => Myresource.maxLength)
            .Unless(o => null == o);
    }
}

а затем в вашем OrderValidator:

public OrderValidator : AbstractValidator<Order>
{
    public OrderValidator()
    {
        Custom(Order =>
        {
            //Did some custom validation...works fine.
        });

        this
            .RuleFor(o => o.OfficeAddress)
            .SetValidator(new AddressValidator());
    }
}
person Darin Dimitrov    schedule 21.06.2013