Подтвердить указанные c элементов в списке в модели - PullRequest
1 голос
/ 14 июля 2020

Я использую плавную проверку для проверки модели

У меня есть список категорий в модели

// это работает

 RuleForEach(x => x.Categories)
     .Must((x, cat) => cat.SelectedOption != 0)
     .WithMessage("{0}", (x, cat) => cat.ValidationMessage);

Но я хочу только проверьте конкретные c категории, поэтому я делаю что-то вроде этого. Однако при этом возникает ошибка:

Имя свойства не может быть автоматически определено для выражения x => x.Categories.FirstOrDefault (y => (y.CategoryId == 123)). Укажите любое имя настраиваемого свойства, вызвав «WithName».

 RuleFor(x => x.Categories.FirstOrDefault(y => y.CategoryId == 123))
    .Must((x, cat) => cat.SelectedOption != 0)
    .WithMessage("{0}", (x, cat) => cat.ValidationMessage);

Категория выглядит примерно так:

 public class Category
 {
        public string CategoryName { get; set; }
        public int CategoryId { get; set; }
        public int SelectedOption { get; set; }
        public string ValidationMessage { get; set; }
 }

моя модель имеет List<Category> Categories;

Ответы [ 3 ]

0 голосов
/ 14 июля 2020

Вы пытаетесь использовать FirstOrDefault, поэтому он попытается проверить только первую категорию с помощью CategoryId == 123. Вместо этого вы должны использовать .Where, чтобы вы отфильтровали все категории с этим идентификатором для проверки:

RuleForEach(x => x.Categories)
.Where(cat => cat.CategoryId == 123)
.Must((x, cat) => cat.SelectedOption != 0)
.WithMessage("{0}", (x, cat) => cat.ValidationMessage);
0 голосов
/ 16 июля 2020

Я не доволен решением, но похоже, что оно работает

 var categoriesToCheck = new int[] { 123, 456, 789 };
 foreach (var categoryId in categoriesToCheck)
 {
    RuleFor(x => x.Categories)
      .Must((x, cat) => x.Categories.Any(y => y.CategoryId == categoryId && y.SelectedOption != 0))
      .WithMessage("{0}", (x, cat) => x.Categories.FirstOrDefault(y => y.CategoryId == categoryId).ValidationMessage);

  }
0 голосов
/ 14 июля 2020

Вы можете использовать операторы When и Unless , чтобы включать или исключать элементы из проверки:

 RuleFor(x => x.Categories)
    .Must((x, cat) => cat.SelectedOption != 0)
    .When(x => x.Categories.Any(y => y.CategoryId == 123))
    .WithMessage("{0}", (x, cat) => cat.ValidationMessage);

РЕДАКТИРОВАТЬ: на основе недавно выявленного требования.

Проверка значения SelectedOption должна выполняться только в той категории, где идентификатор равен 123

Мое предложение: создайте для этого отдельный валидатор.

public class CategoryValidator : AbstractValidator<Category>
{
      public CategoryValidator()
      {
         RuleFor(category => category)
          .Must(cat => cat.SelectedOption != 0)
          .When(cat => cat.CategoryId == 123);
      }
}

И зарегистрируйте этот валидатор для каждой категории.

RuleForEach(x => x.Categories)
   .SetValidator(new CategoryValidator());

РЕДАКТИРОВАТЬ 2: Поддержка нескольких категорий

public class CategoryValidator : AbstractValidator<Category>
{
      public static readonly ImmutableArray<int> specialCategories 
          = ImmutableArray.Create(123, 456, 789);
    
      public CategoryValidator()
      {
         RuleFor(category => category)
          .Must(cat => cat.SelectedOption != 0)
          .When(cat => specialCategories.Contains(cat.CategoryId))
          .WithMessage(cat => cat.ErrorMessage);
      }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...