0

我正在处理 Asp.net MVC4.0 中的一个应用程序,我是具有以下属性的 Model CountryInformation。

[Required(ErrorMessage = "This field is required.")]
    [Display(Name = "Country Name")]
    public string CountryName { get; set; }

    [Required(ErrorMessage = "This field is required.")]
    [RegularExpression(@"^[+-]?[0-9]{1,9}(?:\.[0-9]{1,6})?$",ErrorMessage = "Input decimal numbers.")]
    public float Latitude { get; set; }
    [Required(ErrorMessage = "This field is required.")]
    //[RegularExpression(@"^[+-]?[0-9]{1,9}(?:\.[0-9]{1,6})?$", ErrorMessage = "Input decimal numbers.")]
    public float Longitude { get; set; }
    [Required(ErrorMessage = "This field is required.")]
    //[RegularExpression(@"^[+-]?[0-9]{1,9}(?:\.[0-9]{1,6})?$", ErrorMessage = "Input decimal numbers.")]
    [Display(Name = "GMT Offset")]
    public float GMTOffSet { get; set; }

    public string Currency { get; set; }

在我为 Latitude 字段输入错误的值后验证模型时一切正常,即 abc 当然不是小数,然后它不显示我的错误消息但“值'abc'对纬度无效。” 我在页面源代码中看到的每个值

<input id="Latitude" class="input-validation-error text-box single-line" type="text" value="abc" name="Latitude" data-val-required="This field is required." data-val-regex-pattern="^[+-]?[0-9]{1,9}(?:\.[0-9]{1,6})?$" data-val-regex="Input decimal numbers." data-val-number="The field Latitude must be a number." data-val="true">

值“abc”对纬度无效。请描述为什么我没有看到我的消息

4

2 回答 2

2

想象一下,你在一个房间里,你的工作是确保从墙上的洞中插入的砖块是圆形的。为了达到这个值,孔是圆形的。当你得到一个方块时,你的工作就是拉响警报,也就是 3 个铃铛。

现在,有人走过来,试图将一块方块穿过圆孔。哎呀...它不适合。所以你永远不会得到方块,也不会发出警报。取而代之的是,这个人发出了 2 声铃铛的警报,因为他无法将方块放入圆孔中。

在这个比较中,正则表达式是你。你被告知要验证不可能发生的事情,因为 abc 不能以十进制值存储。因此,纬度或经度的值永远不能是有效的十进制值(特别是因为您没有使用可为空的小数,因此它的默认值始终为 0.0 并且不能为空)。

同时,MVC 框架注意到您正在尝试将字符串填充为十进制值,但它无法做到这一点......因此它会引发一般错误。

换句话说,使用十进制自动验证它是一个有效的十进制数。如果您使用可为空的小数,则它会验证它是十进制数还是空。然后,您可以使用 Required 验证器来确保它不为 null 并传递您自己的消息。

如果您想使用正则表达式验证器,您必须制作纬度和经度字符串,然后在稍后的过程中将它们转换为小数。

于 2013-10-11T07:14:30.453 回答
0

尝试这个:

*^[0-9]([.,][0-9]{1,3})?$*

它会接受

xy 和 x,y 类型数据,如果您不想要,将表达式替换为

*^[0-9]([.][0-9]{1,3})?$*

问题在于?:它检查但不捕获的 in you 表达式。

于 2013-10-11T07:18:10.107 回答