2015-08-27 4 views
3

Я использую текущую проверку i ASP.NET MVC-приложения, и у меня была проблема. Это мое правило:Fluent Validation - передать параметр в валидатор коллекции

RuleFor(x => x.SimpleList) 
     .SetCollectionValidator(new SimpleListValidator()) 
     .When(x => x.Type == SimpleEnum.SpecificType); 

Я хочу передать x.Type параметров в SimpleListValidator, как я могу это сделать? Какой-то метод расширения? Это должно выглядеть примерно так:

RuleFor(x => x.SimpleList) 
     .SetCollectionValidator(new SimpleListValidator(x => x.Type)) 
     .When(x => x.Type == SimpleEnum.SpecificType); 
+0

Привет, что такое SimpleListValidator? Что-то не хватает в вопросе? – ShloEmi

+0

Я думаю, это не имеет значения. Это какой-то валидатор, который я хочу применить в моем списке, но этот «SimpleListValidator» принимает один параметр в конструкторе, и это так. Теперь я не могу передать лямбда-выражение «x => x.Type», и я не знаю, как создать правильный метод расширения, например SetCollectionValidator. – Lazys

+0

Если я правильно понимаю, SimpleListValidator CTOR получает 1 arg: Тип, если это так: Рассмотрим использование typeof (X): новый SimpleListValidator (typeof (x)). Будет ли это работать? – ShloEmi

ответ

3

После установки сбора валидатор для недвижимости - вы можете забыть о том,, что основная модель и (n - 1) подмодели существует кроме подмодели быть в настоящее время подтверждено. И нет возможности передать основную модель в качестве параметра в SetCollectionValidator.

Таким образом, вы должны использовать RuleForEach метод вместо установки сбора валидатор:

RuleForEach(x => x.SubEntities) 
    .Must((model, submodel) => IsValidFirst(submodel, model)) // your rules should go here to be applicable to each collection item 
     .WithMessage("The item with values {0}, {1} has duplicates in collection of {2} items", 
      (model, submodel) => submodel.Field1, 
      (model, submodel) => submodel.Field2, 
      (model, submodel) => model.SubEntities.Count); // for error message building you can access both model and submodel being validated 
    .Must((model, submodel) => IsValidSecond(submodel, model)) // yet another rule 
     .WithMessage("...") 
    .When(model => 
     model.Type == SimpleEnum.SpecificType) // can access to main model only, but it is enough for your purposes 

Я думаю, что возможность сказать ребенку валидатор о самом деле, что родительская модель может существует, должна быть реализована в будущем, но сейчас существует единственный рабочий подход, упомянутый выше.

UPDATE

Вы можете создавать собственные ModelBinder, что бы установить Parent свойство каждого subentity к основному значению объекта, и продолжить использование SetCollectionValidator().

+0

Отлично, это то, что я искал :) – Lazys

4

Это возможно, и вы можете сделать это следующим образом:

В классе SetCollectionValidator вы должны создать конструктор принимая вашу модель в качестве параметра (или что-нибудь еще вы хотели бы передать на валидатор). Помните, что вы должны оставить конструктор без параметров в классе SimpleListValidator.

+0

Спасибо! <3 <3 <3 – karlingen