繁体   English   中英

检查参数是否是具有流畅验证的 3 个值之一

[英]checking if parameter is one of 3 values with fluent validation

我有一个包含一个字符串属性的类:

public class Bla
{
    public string Parameter { get; set; }
}

我想编写一个自定义 AbstractValidator,它检查 Parameter 是否等于这些字符串之一:

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));

用法:

RuleFor(m => m.Job)
    .In("Carpenter", "Welder", "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}");
    }
}

同意上面 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");
    }

我经常将它用于BeAValidZipCodeBeAValidPhoneNumber类的BeAValidZipCode ,或者表达一个业务概念的一些复杂逻辑。 您可以将它与标准验证概念结合使用(例如,避免尝试将所有验证放在一种方法中)。

RuleFor(x => x.Type).Must(x => x.Equals("K") || x.Equals("D")).WithMessage("Err Message!");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM