2011-06-24 8 views
4

エラーメッセージに値を渡すことは可能ですか?流暢な検証を使用してエラーメッセージに値を渡す方法

RuleFor(x => x.ForeName).Length(1, 255).WithLocalizedMessage(() => String.Format(ValidationErrors.TooLong, "255")); 

によりvalidationErrorsが含まれている私のリソースファイルです:

TooLong {0}文字未満を使用してください私はこのような何かを試してみました。

この

RuleFor(x => x.ForeName).Length(1, 255).WithLocalizedMessage(() => ValidationErrors.TooLong); 

が正常に動作します。

答えて

6

FluentValidation(v2)の現在リリースされているバージョンでは、ローカライズされたメッセージを使用するときはサポートされていません。

WithLocalizedMessageの最初の引数は常にリソースプロパティを識別する必要があります。その中に任意のコード(string.formatの呼び出しなど)を置くことはできません。あなたは非ローカライズされたメッセージを使用している場合

あなたはこれを行うことができます。

RuleFor(x => x.Property).Length(1,255).WithMessage("Max number of chars is {0}", "255"); 

ます。またFluentValidation v3ののようにローカライズされたエラーメッセージと、このアプローチを使用することができますが、ないバイナリがありませんまだリリースしていないので、これを利用したい場合は、プロジェクトサイトからソースを取得してビルドすることができます。

代わりに、数値のプレースホルダを使用する代わりに、デフォルトのバリデータの名前付きプレースホルダのサポートをFVに組み込むことができます。したがって、.Length(1、255)を使用している場合は、{0}ではなく、エラーメッセージ内で{MaxLength}を使用できます。

{MaxLength}文字未満を使用してください。

...とFVは自動的にこれを最大値として入力した値に置き換えます。名前付きプレースホルダの完全なリストはin the documentationです。

+0

ありがとうございました。私はこのような解決策ではないと思います:RuleFor(x => x.ForeName).Length(1、255).WithMessage(ValidationErrors.TooLong、 "255")); – cs0815

+1

この問題は、ルールが構築されたときにローカライズされたメッセージを参照するように強制することです。これはいくつかの状況ではうまくいくかもしれませんが、(パフォーマンスのために)推奨される動作であるバリデーターを(例えばIoCコンテナーを使用して)キャッシュしている場合、異文化のユーザーは間違った言語のメッセージで終わる可能性があります。 WithLocalizedMessageはリソースタイプとリソース名をキャッシュし、メッセージが必要になるたびに新しく検索します。 –

関連する問題