检查参数是否是具有流畅验证的 3 个值之一
checking if parameter is one of 3 values with fluent validation
我有一个 class 包含一个字符串 属性:
public class Bla
{
public string Parameter { get; set; }
}
我想编写一个自定义的 AbstractValidator,它检查参数是否等于以下任一字符串:
str1, str2, str3
我想这将是一个起点:
RuleFor(x => x.Parameter).Must(x => x.Equals("str1") || x.Equals("str2") || x.Equals("str3")).WithMessage("Please only use: str1, str2, str3");
但是我可以链接它并显示一条错误消息,最好不要对可能性进行硬编码,例如:
Please only use: str1, str2, str3
您可以使用包含您的条件的列表来执行此操作
List<string> conditions = new List<string>() { str1, str2, str3 };
RuleFor(x => x.Parameter)
.Must(x => conditions.Contains(x))
.WithMessage("Please only use: " + String.Join(",", conditions));
同意上面 Thomas 的代码片段。我有时喜欢采用的另一种方法:如果验证作为一个领域概念有意义,您可以将其分解为一个方法,例如:
RuleFor(x=>x.Parameter).Must(BeAValidParameter).WithMessage("Your parameter must be a valid parameter.");
private static bool BeAValidParameter(string arg)
{
return arg.Equals("str1") || arg.Equals("str2") || arg.Equals("str3");
}
我经常将其用于 BeAValidZipCode
或 BeAValidPhoneNumber
之类的事情,或者表达一个业务概念的一些复杂逻辑。您可以将它与标准验证概念结合使用(例如,避免尝试将所有验证放在一个方法中)。
用法:
RuleFor(m => m.Job)
.In("Carpenter", "Welder", "Developer");
输出:
Job must be one of these values: Carpenter, Welder or Developer
扩展方法:
public static class ValidatorExtensions
{
public static IRuleBuilderOptions<T, TProperty> In<T, TProperty>(this IRuleBuilder<T, TProperty> ruleBuilder, params TProperty[] validOptions)
{
string formatted;
if (validOptions == null || validOptions.Length == 0)
{
throw new ArgumentException("At least one valid option is expected", nameof(validOptions));
}
else if (validOptions.Length == 1)
{
formatted = validOptions[0].ToString();
}
else
{
// format like: option1, option2 or option3
formatted = $"{string.Join(", ", validOptions.Select(vo => vo.ToString()).ToArray(), 0, validOptions.Length - 1)} or {validOptions.Last()}";
}
return ruleBuilder
.Must(validOptions.Contains)
.WithMessage($"{{PropertyName}} must be one of these values: {formatted}");
}
}
RuleFor(x => x.Type).Must(x => x.Equals("K") || x.Equals("D")).WithMessage("Err Message!");
我有一个 class 包含一个字符串 属性:
public class Bla
{
public string Parameter { get; set; }
}
我想编写一个自定义的 AbstractValidator,它检查参数是否等于以下任一字符串:
str1, str2, str3
我想这将是一个起点:
RuleFor(x => x.Parameter).Must(x => x.Equals("str1") || x.Equals("str2") || x.Equals("str3")).WithMessage("Please only use: str1, str2, str3");
但是我可以链接它并显示一条错误消息,最好不要对可能性进行硬编码,例如:
Please only use: str1, str2, str3
您可以使用包含您的条件的列表来执行此操作
List<string> conditions = new List<string>() { str1, str2, str3 };
RuleFor(x => x.Parameter)
.Must(x => conditions.Contains(x))
.WithMessage("Please only use: " + String.Join(",", conditions));
同意上面 Thomas 的代码片段。我有时喜欢采用的另一种方法:如果验证作为一个领域概念有意义,您可以将其分解为一个方法,例如:
RuleFor(x=>x.Parameter).Must(BeAValidParameter).WithMessage("Your parameter must be a valid parameter.");
private static bool BeAValidParameter(string arg)
{
return arg.Equals("str1") || arg.Equals("str2") || arg.Equals("str3");
}
我经常将其用于 BeAValidZipCode
或 BeAValidPhoneNumber
之类的事情,或者表达一个业务概念的一些复杂逻辑。您可以将它与标准验证概念结合使用(例如,避免尝试将所有验证放在一个方法中)。
用法:
RuleFor(m => m.Job)
.In("Carpenter", "Welder", "Developer");
输出:
Job must be one of these values: Carpenter, Welder or Developer
扩展方法:
public static class ValidatorExtensions
{
public static IRuleBuilderOptions<T, TProperty> In<T, TProperty>(this IRuleBuilder<T, TProperty> ruleBuilder, params TProperty[] validOptions)
{
string formatted;
if (validOptions == null || validOptions.Length == 0)
{
throw new ArgumentException("At least one valid option is expected", nameof(validOptions));
}
else if (validOptions.Length == 1)
{
formatted = validOptions[0].ToString();
}
else
{
// format like: option1, option2 or option3
formatted = $"{string.Join(", ", validOptions.Select(vo => vo.ToString()).ToArray(), 0, validOptions.Length - 1)} or {validOptions.Last()}";
}
return ruleBuilder
.Must(validOptions.Contains)
.WithMessage($"{{PropertyName}} must be one of these values: {formatted}");
}
}
RuleFor(x => x.Type).Must(x => x.Equals("K") || x.Equals("D")).WithMessage("Err Message!");