【发布时间】:2017-03-10 08:50:11
【问题描述】:
我有基于ASP.Net WebAPI 的应用程序。下面是我的 DTO。
public class CustomerTO
{
[Required(ErrorMessage="Name required")]
[StringLength(50, MinimumLength = 3, ErrorMessage = "Name invalid")]
public string Name { get; set; }
[Required(ErrorMessage="CountryId required")]
[Range(1,250,ErrorMessage="CountryId invalid")]
public int Country { get; set; }
}
我的 API 控制器。
[HttpPost]
[AllowAnonymous]
public HttpResponseMessage Post([FromBody]CustomerTO model)
{
if (ModelState.IsValid)
{
//my stuff
}
else
{
var msg = ModelState.SelectMany(s => s.Value.Errors).FirstOrDefault().ErrorMessage;
}
}
如果用户将任何必填字段作为Null 传递,它将返回Data Annotations 中提到的正确错误消息,而如果我将string 传递给CountryId,它将进入else 条件(@987654329 @)
但是 ErrorMessage 是空的。
如果我调试并快速查看以下语句。
msg = ModelState.SelectMany(s => s.Value.Errors).FirstOrDefault().Exception.Message;
它返回 - Could not convert string to integer: en. Path 'Country', line 6, position 14.
为什么在这种情况下,我没有收到 CountryId Invalid 的错误消息
我如何得到这个?
【问题讨论】:
-
我会认为是因为您输入的字符串 Country 正试图绑定到整数 Country。如果你在“ModelState.Isvalid”上放一个断点并检查“model”的内容......你能在模型中看到同样的异常吗?
-
@Wheels73,是的,也这样做了
-
我相信范围验证器不适合字符串输入,即它们只有在它是有效整数时才会触发。它不强制传入的类型。尝试将您的注释更改为正则表达式。 [RegularExpression("([1-9][0-9]*)")]
-
@Wheels73,有道理。我会检查谢谢:)
-
如果可行,我将作为答案发布! :)
标签: c# validation asp.net-web-api data-annotations modelstate