2016-04-19 24 views
1

ポストバックを行う際に価格フィールドを適切に検証するにはどうすればよいですか? 私はすでにチェックしました:How can I validate a currency field?しかし、それは私の期待を満たしていません。価格/通貨フィールドを正しく検証する方法は?

私が試した(そしていくつかのバリエーション)き

[Range(0, (double)decimal.MaxValue)] 
[DataType(DataType.Currency, ErrorMessage = "...")] 
public decimal? Price {get; set;} 

問題:

  • それは検証を実行するには、[データ型...]属性を使用することはありません。
  • 使用されている値が小数点以下の型でない場合、発行された検証エラーは標準の英語メッセージであり、カスタマイズする必要はありません。
  • 10進数ではなく文字列を作成すると、10進数でない値または負の値に対して範囲の検証が行われますが、それでも期待通りの通貨形式ではない1.23456のような値が許可されます。

独自のカスタム検証または正規表現を作成する前に、組み込みのアプローチを探しています。次のようなもの:

[EmailAddress()] 
public string ContactEmail {get; set; } 

これは完全に私に合っています!

+0

どのような確認が必要ですか? –

+0

通常の通貨価値(通貨記号を除く)。例えば、9.99,0.80,128.50のようになります。擬似正規表現では:d * [.d [d]]。組み込みのソリューションがすでに存在する場合は、自分で作成する必要はありません。 – mdarefull

+0

入力を小数点以下2桁までに制限したいのですか? (もしそうなら、いつも 'RegularExpressionAttribute'を使うことができます) –

答えて

1

FluentValidationを使用できます。 AbstractValidatorを継承した独自のバリデータークラスを作成し、コンストラクター内ですべてのロジックを配置することができます。

MyCurrencyValidatorMyClass : AbstractValidator<MyClass> 
{ 
    MyCurrencyValidatorMyClass() 
    { 
     RuleFor(x => x.MyField).NotNull().GreatherThan(0); 
     //All your rules 
    } 
} 

var validator = new MyCurrencyValidatorMyClass(); 
var myClassVar = new MyClass(); 
validator.Validate(myClassVar); 

また、あなたが参考のために、小数点参考のため https://fluentvalidation.codeplex.com/wikipage?title=mvc

を参照してください、MVCを使用してバリデータを統合することができますが、これはnugetパッケージhttps://www.nuget.org/packages/FluentValidation

0

ある https://github.com/JeremySkinner/FluentValidation/blob/master/src/FluentValidation/Validators/ScalePrecisionValidator.cs

を参照してくださいあなたはこれを試すことができますあなたのPriceモデルプロパティのRegExこれは、Xが数値の桁(0-9)である「XXXX.XX」の形式の文字列をチェックします:

[RegularExpression(@"\d{1,20}(\.\d{1,2})?", ErrorMessage = "Invalid Price. Please use the format of XXXX.XX.")] 

d{1, 20}は、最大20桁の小数点の前に可能にする最初の範囲を。 2番目の範囲d{1, 2}は、小数点以下2桁までを許可します。

関連する問題