#c# #fluentvalidation
Вопрос:
Скажи, что у меня есть этот мидель
class Model { public Optionallt;stringgt; Str { get; set; } }
Можно ли сопоставить необязательное поле таким образом, чтобы правила игнорировались, когда необязательное поле пустое и в противном случае оно не используется? Например, когда HasValue
верно — примените всю цепную проверку, когда HasValue
ложно — игнорируйте всю цепную проверку.
class MyValidator : AbstractValidatorlt;Modelgt; { MyValidator() { RuleForEx(x =gt; x.Opt) // see below .NotNull(); // apply string rules, not Optionallt;stringgt; rules } // Is it possible to implement something like this? private IRuleBuilderInitiallt;Model, stringgt; RuleForEx(Expressionlt;Funclt;T, Optionallt;stringgt;gt;gt; expression) { return Transform(expression, x =gt; x.HasValue : x.Value ? `[no idea what is here]`); } }
Комментарии:
1. Я чувствую, что был бы возможен метод расширения с именем
RuleForOptional(x =gt; x.Opt)
, который возвращает объект построителя правил дляT
inOptionallt;Tgt;
.2.
RuleFor(x =gt; x.Opt.Value).NotNull().When(x =gt; x.Opt.HasValue);
Не работает? Я также ставлю под сомнение использование необязательного здесь в модели представления.3. @GregBurghardt, судя по реализации
Optionallt;Tgt;
, это вызовет исключение, если нет значения иValue
доступ к нему осуществляется без проверкиHasValue
, но это выражение, а не просто функция, так что, возможно, этот подход сработает. Причина этого — моя лень-я хочу повторно использовать существующие проверки и не хочу писать свои собственные4. Выполняется
When(...)
перед вызовом получателя. Но, я понимаю вашу лень 🙂5. Может быть, создать класс с именем
OptionalRuleBuilderlt;T, TPropertygt;
, который реализуетIRuleBuilderInitiallt;T, TPropertygt;
? Затем создайте общий родительский класс для ваших валидаторов сRuleForOptional
помощью метода?