【问题标题】:MVC3 Data Annotations Regular Expression validator Attribute failingMVC3 数据注释正则表达式验证器属性失败
【发布时间】:2011-08-04 21:41:10
【问题描述】:

我的一个视图模型有一个属性 GramWeight,定义为

    [Display(Name="Gram Weight")]
    [RegularExpression(@"[0-9]*\.?[0-9]+", ErrorMessage = "Gram Weight must be a Number.")]
    [Range(0, 9999.99, ErrorMessage = "Value must be between 0 - 9,999.99")]
    public decimal? GramWeight { get; set; }

当用户输入带前导小数点的值时,此字段的验证失败,例如 0.23 而不是 0.23。如果用户将 0 添加到前面,则验证通过。我曾认为这是我的正则表达式的问题,但我在http://regexhero.net/tester/ 上运行了一些测试,它似乎工作得很好。

那么,如果它不是正则表达式,是不是别的?如果用户不这样做,我将准备使用 javascript 为用户附加一个 0。这是我最后的选择,但我正在考虑。

【问题讨论】:

    标签: regex asp.net-mvc-3 validation jquery-validate


    【解决方案1】:

    是不是因为它是十进制类型,你有没有试过把GramWeight改成字符串,只是为了看看验证器在这种情况下做了什么?

    【讨论】:

    • 好的,似乎当我将属性类型更改为字符串时,它就可以工作了。虽然这解释了问题,但我不确定我是否喜欢我的模型将所有十进制字段表示为字符串的想法。我想,这对风景来说很棒,但其他地方都没有。由于我的模型经常作为域对象,这真的很糟糕。不过感谢您的解决方案。
    • 听起来有点像javascript,如果它以小数点开头,可能会被要求以零作为前缀。您是否也在使用客户端验证/输入过滤?
    • 是的,我是。我对很多这些东西都很陌生。捕捉前导小数并附加零的最佳方法是什么?我在想模糊。如果我这样做,它会在客户端验证触发之前触发吗?
    • 您可以在调用服务器端代码的位置添加零前缀。但是当用户离开时将输入更改为零可能会让用户感到困惑。如果可能,并且如果您正在为某种客户编写此代码,您可以尝试询问他们是否有偏好,甚至为他们设计原型。如果您无法在他们面前得到一些东西,我建议您使用 Jing,然后您可以通过问题与他们交谈。
    • 我建议不要将视图模型用作域对象。此外,用户输入的所有内容实际上都只是字符串。与视图模型的自动绑定可以将正确的字符串转换为 int 等。但是,某些用户可能会执行 1,000 之类的操作并且绑定失败。我建议将所有内容都作为字符串并运行正则表达式进行验证。一旦进入控制器验证,然后让控制器简单地负责将视图模型转换为域对象,然后调用您需要执行的任何业务逻辑或 crud。
    【解决方案2】:

    对于那些需要更好解决方案的人来说,这里有一个正确的正则表达式来验证十进制数:

    [RegularExpression(@"[-+]?[0-9]*\.?[0-9]?[0-9]")]
    

    此正则表达式在点号之前需要一个数字(在您的情况下为零),并且最多允许 2 个小数。

    【讨论】:

    • 我想允许前导小数,不带 0。在许多情况下,我需要多于一位小数。 .00125 是一个通用值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多