C# 为什么将异常消息获取为null
我有基于ASP.Net WebAPI的应用程序。下面是我的DTOC# 为什么将异常消息获取为null,c#,validation,asp.net-web-api,data-annotations,modelstate,C#,Validation,Asp.net Web Api,Data Annotations,Modelstate,我有基于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="Count
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
,它将返回数据注释中提到的正确错误消息
,而如果我传递CountryId
的字符串
,它将进入else
条件(*ModelState.IsValid=false*
)
但是错误消息是空的
而如果我调试并将下面的语句放入quick watch中
msg = ModelState.SelectMany(s => s.Value.Errors).FirstOrDefault().Exception.Message;
它返回-无法将字符串转换为整数:en。路径“国家”,第6行,位置14。
为什么在这种情况下,我没有收到错误消息作为CountryId Invalid
我如何得到这个呢?据我所知,这是一个常见的问题: 根据代码,从任何验证属性都有,派生自。每个包装器调用
IsValid
方法的ValidationAttribute
。在RequestFieldValidatorBase
的Validate
方法中,传递表单值进行验证
因此,RequiredAttribute
不会失败,因为表单值不是空的,也不是null
,RangeAttribute
不会失败,因为它在将该值转换为int时遇到问题
为实现所需的行为,建议您创建自己的验证属性或使用
RegularExpressionAttribute
。你可以看一下。我相信范围验证器不适合字符串输入,也就是说,只有当它是一个有效的整数时才会启动。它不强制传入的类型。
尝试将注释更改为正则表达式
[RegularExpression("([1-9][0-9]*)", ErrorMessage = "Country code invalid")]
public string Country { get; set; }
关于这个链接
作为脏补丁,我将属性从int
修改为string
&用正则表达式修饰它。使用不阻止引发“无法将字符串转换为整数”异常。所以只需过滤正确的一个:
var msg = ModelState.SelectMany(s => s.Value.Errors)
.FirstOrDefault(_ => _.Exception == null)
.ErrorMessage;
我认为这是因为您输入的字符串Country试图绑定到整数国家。如果您在“ModelState.Isvalid”上设置断点并检查“model”的内容。。。你能在模型中看到同样的异常吗?@Wheels73,是的,sameI是否认为范围验证器不适合字符串输入,即,只有当它是有效整数时才会触发。它不强制传入的类型。尝试将注释更改为正则表达式。[RegularExpression(“([1-9][0-9]*)”@Wheels73,有道理。我会检查谢谢:)如果有效,我会作为答案发布!:)@Kgn web,如果您将数据类型保持为
int
,则只需修改错误消息筛选:var msg=ModelState.SelectMany(s=>s.Value.Errors).FirstOrDefault(\u=>\ u0.Exception==null).ErrorMessage代码>@AndriyTolstoy,是的。对,那太好了。请将此作为ans发布,并附上简短解释是的。它满足了我的要求,没有脏补丁,谢谢:)