FluentValidation 3:WithMessage字符串格式错误

时间:2012-08-29 09:36:18

标签: c# asp.net-mvc asp.net-mvc-3 fluentvalidation

我使用FluentValidation 3,当我使用重载的WithMessage方法时,我遇到了一个奇怪的问题。

复合格式字符串格式不正确。我的格式字符串中出现“true”而不是{0}。所有其他格式项都不会被替换。

例如:

 public class MyModelValidator : AbstractValidator<MyModel>
    {
        public MyModelValidator()
        {
            RuleFor(x => x.Caption).NotNull().WithMessage("{0} ----- {1}", "one", "two" );
        }
    }

我获得的验证字符串是:“true----- {1}”而不是“one----- two”。

你能解释一下我的代码有什么问题吗?

1 个答案:

答案 0 :(得分:1)

嗯,源代码中的响应是......

你使用WithMessage的这个重载(我必须说它的用法并不是很清楚):

public static IRuleBuilderOptions<T, TProperty> WithMessage<T, TProperty>(this IRuleBuilderOptions<T, TProperty> rule, string errorMessage, params object[] formatArgs) {
    var funcs = ConvertArrayOfObjectsToArrayOfDelegates<T>(formatArgs);
    return rule.WithMessage(errorMessage, funcs);
    }

所以“一个”和“两个”被更改为Func<T, object>的数组,当然,这将导致您的代码出现奇怪的行为......

您应该在案件中使用string.Format

WithMessage(string.Format("{0} ----- {1}", "one", "two" ));

顺便说一句,FluentValidation消息“已经预先格式化”: 在WithMessage中使用{0}的目的是修改{0}周围的文本。 例如,NotNull具有“1参数”预格式化消息。 这就是为什么你的{0}转变为“真实”的原因,我认为。