C# 为什么将异常消息获取为null

C# 为什么将异常消息获取为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

我有基于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
,它将返回
数据注释中提到的正确错误消息
,而如果我传递
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发布,并附上简短解释是的。它满足了我的要求,没有脏补丁,谢谢:)