2016-07-19 1 views
1

classe à l'intérieur qui est responsable de la validation je règle simple:FluentValidation modifier un message d'erreur dans la fonction Must

RuleFor(u => u.Id) 
    .Cascade(CascadeMode.StopOnFirstFailure) 
    .NotEmpty().WithMessage("Id is required") 
    .Must(ValidateId); 

et ci-dessous est ma fonction ValidateId:

private bool ValidateId(CreateAccountBindingModel model, string id, PropertyValidatorContext context) 
{ 
    if (id=="test") 
    { 
     context.Rule.CurrentValidator.ErrorCodeSource = new StaticStringSource("You are testing"); 
     return false; 
    } 

    var idValid = IdValidator.IsValid(id); 
    if (!idValid) 
    { 
     context.Rule.CurrentValidator.ErrorCodeSource = new StaticStringSource("Id is invalid"); 
     return false; 
    } 
    return true; 
} 

Si je lance mon validateur je reçois erreur par défaut, pas mes erreurs personnalisées Je spécifie dans ma fonction.
J'ai essayé de les mettre à l'aide:

context.Rule.CurrentValidator.ErrorCodeSource = new StaticStringSource("Id is invalid"); 

mais sans aucune chance. Comment puis-je définir un message d'erreur dans la fonction de validation?

+0

@ AlekseyL.sorry pour une réponse si tardive. J'ai créé une extension qui me permet d'appeler 'OnFailure' pour chaque règle. J'ai posté mon code dans le dépôt FluentValidation (https://github.com/JeremySkinner/FluentValidation/issues/299#issuecomment-233904267) et j'attends l'avis de Jeremy. J'ai implémenté cette solution dans mon projet et cela fonctionne bien, mais j'aimerais que l'auteur l'examine avant de l'afficher ici. Peut-être que vous pourriez le regarder? – Misiu

+0

Je pense que ce n'est pas lié à cette question .. –

+0

@AlekseyL. Désolé pour ça. J'ai pris des questions. Ce lien est lié à http://stackoverflow.com/questions/38436630/fluentvalidation-logonfailure-override – Misiu

Répondre

1

Vous pouvez définir un message d'erreur en utilisant MessageBuilder:

if (id == "test") 
{ 
    context.Rule.MessageBuilder = c => "You are testing"; 
    return false; 
} 
+0

Merci, cela fonctionne bien :) – Misiu

1

Je ne mettre en œuvre ce que vous essayez de faire avec une fonction de validation personnalisée que vous pouvez le faire en utilisant FluentValidation lui-même:

RuleFor(u => u.Id) 
.Cascade(CascadeMode.StopOnFirstFailure) 
.Must(x => x !="test").WithMessage("You are testing.") 
.Must(x => IdValidator.IsValid(x)).WithMessage("Id is invalid."); 
+0

Je vais essayer, mais à l'intérieur de ma fonction de validation personnalisée, j'ai plus de logique, y compris la connexion et l'accès à la base de données, bo je ferais être génial si je pouvais définir ce message d'erreur à partir de ma fonction personnalisée. – Misiu