AbstractValidator:显示具有 属性 值的错误消息

AbstractValidator : showing error messages with property values

我在导入 "unknown" 数据时使用以下模式。

public class MyCustomObject
{
    public string MyCustomDateAsString { get; set; }

    public DateTime? MyCustomDate
    {
        get
        {
            DateTime? returnValue = null;
            DateTime parseResult = DateTime.MinValue;
            bool parseAttempt = DateTime.TryParse(this.MyCustomDateAsString, out parseResult);
            if (parseAttempt)
            {
                returnValue = parseResult;
            }
            return returnValue;
        }
    }

    public string MyCustomIntAsString { get; set; }


    public int? MyCustomInt
    {
        get
        {
            int? returnValue = null;
            int parseResult = 0;
            bool parseAttempt = int.TryParse(this.MyCustomIntAsString, out parseResult);
            if (parseAttempt)
            {
                returnValue = parseResult;
            }
            return returnValue;
        }
    }   

}

我有这个工作。

public class MyCustomObjectValidator : AbstractValidator<MyCustomObject>
{
    public MyCustomObjectValidator()
    {
        RuleFor(custobj => custobj.MyCustomDateAsString).NotEmpty().WithMessage("Please specify a MyCustomDateAsString");
        RuleFor(custobj => custobj.MyCustomIntAsString).NotEmpty().WithMessage("Please specify a MyCustomIntAsString");

    }
}

我想添加这些规则。

        RuleFor(custobj => custobj.MyCustomDate).NotNull().WithMessage("MyCustomDate must be a valid non null date.  You specified '{0}'"); /* How can I put MyCustomDateAsString for the {0} */
        RuleFor(custobj => custobj.MyCustomInt).NotNull().WithMessage("MyCustomInt must be a valid non null int.  You specified '{0}'"); /* How can I put MyCustomIntAsString for the {0} */

但我不知道如何让 MyCustomDateAsString 和 MyCustomIntAsString 显示在 MyCustomDate 和 MyCustomInt 的错误消息中。

因此,对于大多数验证器,您会使用 {PropertyValue} 占位符来获取当前 属性 值,但这在这种情况下无济于事,因为您需要另一个 属性 的值.

但是,WithMessage 有一个重载,它采用一个函数,您可以使用该函数来构建自定义占位符值。

RuleFor(x=>x.Foo).NotNull().WithMessage("...blah {0}", x=>x.SomeOtherProperty);

最后一个参数实际上是 Func[T,object] 的参数数组,因此您可以根据需要指定任意数量的参数,并按顺序处理它们。