如何正确验证价格/货币字段?

时间:2016-04-19 13:04:57

标签: c# validation asp.net-mvc-5 model-validation

如何在回发时正确验证价格字段? 我已经检查过:How can I validate a currency field?但这不符合我的期望。

我尝试过(和一些变化):

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

问题:

  • 它从不使用[DataType ...]属性来执行验证。
  • 当使用的值不是十进制类型时,发出的验证错误将是标准的英语消息,我不知道如何自定义和需要。
  • 如果我将其设为字符串而不是十进制?,则会针对非十进制或负值抛出范围验证,但它仍然允许使用如下值:1.23456,这不是我期望的货币格式。< / LI>

在我必须创建自己的自定义验证或正则表达式之前,我正在寻找内置方法。类似的东西:

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

这非常适合我!

2 个答案:

答案 0 :(得分: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);

您也可以将验证器与MVC集成,以供参考,请参阅 https://fluentvalidation.codeplex.com/wikipage?title=mvc

有关十进制参考,请参阅 https://github.com/JeremySkinner/FluentValidation/blob/master/src/FluentValidation/Validators/ScalePrecisionValidator.cs

这是nuget包https://www.nuget.org/packages/FluentValidation

答案 1 :(得分:0)

您可以在Price型号属性上试用此RegEx。它将检查&#34; XXXX.XX&#34;格式的字符串。其中X是数字(0-9):

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

第一个范围d{1, 20}允许小数位前最多二十位数。第二个范围d{1, 2}最多允许两位小数。