Search code examples
c#validationasp.net-web-apidata-annotationsmodelstate

Why getting exception message as null


I have ASP.Net WebAPI based application. Below is my 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; }
}

My API Controller.

 [HttpPost]
    [AllowAnonymous]
    public HttpResponseMessage Post([FromBody]CustomerTO model)
    {
        if (ModelState.IsValid)
        {
           //my stuff
        }
        else
        {
              var msg =  ModelState.SelectMany(s => s.Value.Errors).FirstOrDefault().ErrorMessage;

            }
        }

If user passed any of the required field as Null, it returns the right Error message mentioned in the Data Annotations while if I pass string for CountryId, it enters into else condition(*ModelState.IsValid = false*) But the ErrorMessage is empty.

While If I debug & put the below statement in quick watch.

 msg = ModelState.SelectMany(s => s.Value.Errors).FirstOrDefault().Exception.Message;

It returns - Could not convert string to integer: en. Path 'Country', line 6, position 14.

Why in this scenario, I am not getting the Error message as CountryId Invalid

How do I get this?


Solution

  • Using a RegularExpressionAttribute does not prevent RangeAttribute from throwing an "Could not convert string to integer" exception. So just filter the right one:

    var msg = ModelState.SelectMany(s => s.Value.Errors)
                        .FirstOrDefault(_ => _.Exception == null)
                        .ErrorMessage;