From 166b8ae8aed037ec395f799cc080a5ba75167ea7 Mon Sep 17 00:00:00 2001 From: Michael Mairegger Date: Tue, 9 Apr 2019 08:18:55 +0200 Subject: [PATCH] Show non valid latin code characters when LatinValidator fails. --- Validators/LatinValidators.cs | 36 ++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/Validators/LatinValidators.cs b/Validators/LatinValidators.cs index a6846d2e..27aa6647 100644 --- a/Validators/LatinValidators.cs +++ b/Validators/LatinValidators.cs @@ -1,4 +1,6 @@ -using System.Text.RegularExpressions; +using System; +using System.Text; +using System.Text.RegularExpressions; using FluentValidation; using FluentValidation.Validators; @@ -8,9 +10,8 @@ public abstract class LatinBaseValidator : PropertyValidator { private readonly Charsets _charset; - public LatinBaseValidator(Charsets charset) - : base($"Testo contenente caratteri non validi ({(charset == Charsets.BasicLatin ? "Unicode Basic Latin" : "Unicode Latin-1 Supplement")})") + : base($"Testo contenente caratteri non validi ({(charset == Charsets.BasicLatin ? "Unicode Basic Latin" : "Unicode Latin-1 Supplement")}). valori non accettati: {{NonLatinCode}}") { _charset = charset; } @@ -30,6 +31,35 @@ protected override bool IsValid(PropertyValidatorContext context) } return Regex.Match(context.PropertyValue.ToString(), challenge).Success; } + + protected override void PrepareMessageFormatterForValidationError(PropertyValidatorContext context) + { + base.PrepareMessageFormatterForValidationError(context); + + var sb = new StringBuilder(); + foreach (var c in context.PropertyValue.ToString()) + { + int upperLimit; + switch (_charset) + { + case Charsets.BasicLatin: + upperLimit = 0x7F; + break; + case Charsets.Latin1Supplement: + upperLimit = 0xFF; + break; + default: + throw new ArgumentOutOfRangeException(); + } + + if (c > upperLimit) + { + sb.Append(c); + } + } + + context.MessageFormatter.AppendArgument("NonLatinCode", sb.ToString()); + } } public class BasicLatinValidator : LatinBaseValidator