【问题标题】:How to properly validate a price/currency field?如何正确验证价格/货币字段?
【发布时间】:2016-04-19 13:04:56
【问题描述】:

在回发时如何正确验证价格字段? 我已经检查过:How can I validate a currency field?,但这并没有达到我的期望。

我已经尝试过(以及一些变体):

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

问题:

  • 它从不使用 [DataType...] 属性来执行验证。
  • 当使用的值不是十进制类型时,发出的验证错误将是一个标准的英文消息,我不知道如何自定义并且需要。
  • 如果我将其设为字符串而不是十进制?,那么对于非十进制或负值,范围验证将被抛出,但它仍将允许以下值:1.23456,这不是我所期望的货币格式。

在我必须创建自己的自定义验证或正则表达式之前,我正在寻找一种内置方法。比如:

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

这非常适合我!

【问题讨论】:

  • 你想要什么验证?
  • 通常的货币值(不包括货币符号)。例如:9.99、0.80、128.50。在伪正则表达式中:d*[.d[d]]。只是如果已经存在内置解决方案,我不想自己制作它。
  • 您的意思是要将输入限制在小数点后两位吗? (如果是这样,您可以随时使用RegularExpressionAttribute

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


【解决方案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

【讨论】:

  • 有没有使用ScalePrecisionValidator的例子?
  • @CiaranGallagher 只需创建实例并调用 Validate 方法,或者在构造函数中执行相同操作,调用 Init 然后调用 Validate,或者以这种方式使用它github.com/MichalJankowskii/…
【解决方案2】:

您可以在 Price 模型属性上尝试此 RegEx。它将检查格式为“XXXX.XX”的字符串,其中 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} 最多允许两位小数。

【讨论】:

    猜你喜欢
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多