正则表达式不匹配十进制格式

问题描述 投票:0回答:2

我正在尝试向我的api控制器发帖,传递参数CoordinateModel类

public class CoordinateModel
{
    [Range(-90, 90)]
    [RegularExpression(@"^\d+\.\d{6}$")]
    public double Latitude { get; set; }

    [Range(-180, 180)]
    [RegularExpression(@"^\d+\.\d{6}$")]
    public double Longitude { get; set; }
} 

使用此JSON作为请求正文

{ "Latitude": 12.345678, "Longitude": 98.765543 }

当我尝试用ModelState.IsValid验证模型时说模型无效。这是我对Postman的反应

{
"Latitude": [
    "The field Latitude must match the regular expression '^\\d+\\.\\d{6}$'."
],
"Longitude": [
    "The field Longitude must match the regular expression '^\\d+\\.\\d{6}$'."
]
}

我无法弄清楚我的正则表达式有什么问题。我的纬度/经度必须在小数点分隔符前至少有一位数,并包含6位小数

c# asp.net data-annotations
2个回答
1
投票

ReqularExpression-annotation正在验证解析的double值,而不是输入值。这会使您的代码依赖于区域设置,因为它在验证之前会调用.ToString()。

我建议将字段更改为字符串并稍后解析(可能在getter或setter中)或不验证数字位数 - 否则您将阻止传递类似“98.76554”而不是“98.765540”的api用户(如果保留当前代码,即使是零尾零也会出现问题)。如果需要,您还可以实现自定义验证。

如果无法解析某些东西,它将会失败。

请参阅post from SBFrancies以获取代码以证明此行为。


1
投票

只是为了添加到Compufreaks的答案,我尝试在Console应用程序中手动验证您的代码并且它工作正常,因此可能问题归结为如何解析双打。

public class Program
{

    static void Main(string[] args)
    {
        CoordinateModel model = new CoordinateModel {Latitude = 12.345678, Longitude = 98.765543};

        var vc = new ValidationContext(model);
        var isValid = Validator.TryValidateObject(model, vc,null, true); //isValid == true

        var json = "{ \"Latitude\": 12.345678, \"Longitude\": 98.765543 }";

        model = JsonConvert.DeserializeObject<CoordinateModel>(json);
        vc = new ValidationContext(model);
        isValid = Validator.TryValidateObject(model, vc, null, true); //isValid == true
    }
}

public class CoordinateModel
{
    [Range(-90, 90)]
    [RegularExpression(@"^\d+\.\d{6}$")]
    public double Latitude { get; set; }

    [Range(-180, 180)]
    [RegularExpression(@"^\d+\.\d{6}$")]
    public double Longitude { get; set; }
}
© www.soinside.com 2019 - 2024. All rights reserved.