我正在尝试向我的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位小数
ReqularExpression-annotation正在验证解析的double值,而不是输入值。这会使您的代码依赖于区域设置,因为它在验证之前会调用.ToString()。
我建议将字段更改为字符串并稍后解析(可能在getter或setter中)或不验证数字位数 - 否则您将阻止传递类似“98.76554”而不是“98.765540”的api用户(如果保留当前代码,即使是零尾零也会出现问题)。如果需要,您还可以实现自定义验证。
如果无法解析某些东西,它将会失败。
请参阅post from SBFrancies以获取代码以证明此行为。
只是为了添加到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; }
}