2016-02-19 2 views
7

У меня проблема с FluentValidation, где я хочу отображать одно сообщение независимо от ошибки проверки в заданной цепочке. Например, я определил цепочку валидации для одного свойства ниже. Я ожидал бы, что цепочка будет оценена, и любые сбои приведут к сообщению, определенному в вызове WithMessage() ниже. Однако кажется, что он закорочен и отображает сообщение об ошибке по умолчанию FluentValidation для первой встреченной ошибки. Смотрите ниже код:Одно сообщение для цепи правил?

RuleFor(s => s.ProposalDetail.AgeMin).NotNull() 
     .GreaterThanOrEqualTo(1) 
     .LessThanOrEqualTo(99) 
     .WithMessage("Minimum Age entry is required and must range from 1 to 99 years."); 

То, что происходит в том, что свойство AgeMin равно нулю, поэтому первый NotNull() проверка терпит неудачу и сообщение проверки гласит: «'Предложение Detail Возраст Мин. Не должно быть пустым.» Описание предложения - это имя модели инкапсулирующего вида. Я попытался установить CascadeMode для всего валидатора в CascadeMode.Continue, но он не имеет никакого эффекта.

Как я могу выполнить одно сообщение для одной цепочки проверки собственности?

+0

'С приведенным выше кодом возвращается сообщение проверки по умолчанию, а не cus tom сообщение в конце', где объявлено сообщение по умолчанию.? можете ли вы опубликовать все соответствующие коды .. также вы проверили [fluentvalidation для .NET Documentation /Examples](https://fluentvalidation.codeplex.com/wikipage?title=CreatingAvalator) – MethodMan

+0

Да, я просмотрел документацию и убежище " t нашел аналогичный пример. Я предполагаю, что я должен использовать одно правило, используя 'Must()', чтобы инкапсулировать все правила, чтобы выполнить то, что я пытаюсь сделать. Я бы подумал, что это простой случай. По умолчанию сообщение FluentValidation возвращает '' Detail Detail. Возраст Min 'не должен быть пустым', потому что 'NotNull()' является первым вызовом в цепочке. Я попытался установить 'CascadeMode = CascadeMode.Continue' для валидатора, который не имел никакого эффекта. – TimeBomb006

+0

Просьба предоставить [mcve], который демонстрирует вашу проблему. Это должен быть компилируемый код, который мы можем запустить. – Enigmativity

ответ

7

Update 2

Как выясняется, вы можете сделать то, что вы хотите с помощью простого метода расширения

using FluentValidation; 
using FluentValidation.Internal; 
using FluentValidation.Resources; 
using FluentValidation.Results; 
using System; 
using System.Linq; 

namespace ConsoleApplication9 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      Customer customer = new Customer() { }; 
      CustomerValidator validator = new CustomerValidator(); 
      ValidationResult results = validator.Validate(customer); 
      Console.WriteLine(results.Errors.First().ErrorMessage); 
      Console.ReadLine(); 
     } 
    } 
    public class CustomerValidator : AbstractValidator<Customer> 
    { 
     public CustomerValidator() 
     { 

      RuleFor(s => s.Id).NotNull() 
          .GreaterThanOrEqualTo(1) 
          .LessThanOrEqualTo(99) 
          .WithGlobalMessage("Minimum Age entry is required and must range from 1 to 99 years."); 
     } 

    } 

    public class Customer { public int? Id { get; set; } } 

    public static class MyExtentions 
    { 
     public static IRuleBuilderOptions<T, TProperty> WithGlobalMessage<T, TProperty>(this IRuleBuilderOptions<T, TProperty> rule, string errorMessage) 
     { 
      foreach (var item in (rule as RuleBuilder<T, TProperty>).Rule.Validators) 
       item.ErrorMessageSource=new StaticStringSource(errorMessage); 

      return rule; 
     } 
    } 
} 
+1

Ваше обновление 2 - правильный ответ. Я собирался заглянуть в подобное решение, но вы избили меня. – devuxer

+0

@devuxer Я только оставил предыдущие для образовательных целей –

+1

@GeorgeVovos Это превосходное, элегантное решение этой проблемы. Я подтвердил, что решение работает должным образом. Благодаря! – TimeBomb006

3

Самым простым решением было бы просто установить сообщение для переменной, и применять одно и то же сообщение после каждого правила:

var message = "Minimum Age entry is required and must range from 1 to 99 years."; 
RuleFor(s => s.ProposalDetail.AgeMin) 
    .NotNull() 
     .WithMessage(message) 
    .GreaterThanOrEqualTo(1) 
     .WithMessage(message) 
    .LessThanOrEqualTo(99) 
     .WithMessage(message); 
+1

Я фактически использовал это решение, пока не увидел редактирование Джорджа. Оба подхода жизнеспособны, но мне нравится чистота решения Джорджа. – TimeBomb006

+0

Этот подход может использоваться, когда вам нужно назначать разные сообщения для разных правил проверки. – user1176058

Смежные вопросы