1

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」です。

私のコードのどこが間違っているのか、説明していただけますか?

4

1 に答える 1

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

したがって、「1」と「2」は の配列に変更され Func<T, object>ます。もちろん、コードで奇妙な動作が発生します...

string.Formatあなたのケースで使用する必要があります

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

ところで、FluentValidation メッセージは「既にフォーマット済み」です{0}。WithMessage で使用する目的は、周囲のテキストを変更することです{0}。たとえば、NotNull には「引数 1」の書式設定済みメッセージがあります。だからあなた{0}は「真」に変換されるのだと思います。

于 2012-08-29T10:01:00.220 に答える