Search code examples
c#asp.net-mvclinqmodelstate

ASP.NET MVC How to convert ModelState errors to json


How do you get a list of all ModelState error messages? I found this code to get all the keys: ( Returning a list of keys with ModelState errors)

var errorKeys = (from item in ModelState
        where item.Value.Errors.Any() 
        select item.Key).ToList();

But how would I get the error messages as a IList or IQueryable?

I could go:

foreach (var key in errorKeys)
{
    string msg = ModelState[error].Errors[0].ErrorMessage;
    errorList.Add(msg);
}

But thats doing it manually - surely there is a way to do it using LINQ? The .ErrorMessage property is so far down the chain that I don't know how to write the LINQ...


Solution

  • You can put anything you want to inside the select clause:

    var errorList = (from item in ModelState
            where item.Value.Errors.Any() 
            select item.Value.Errors[0].ErrorMessage).ToList();
    

    EDIT: You can extract multiple errors into separate list items by adding a from clause, like this:

    var errorList = (from item in ModelState.Values
            from error in item.Errors
            select error.ErrorMessage).ToList();
    

    Or:

    var errorList = ModelState.Values.SelectMany(m => m.Errors)
                                     .Select(e => e.ErrorMessage)
                                     .ToList();
    

    2nd EDIT: You're looking for a Dictionary<string, string[]>:

    var errorList = ModelState.ToDictionary(
        kvp => kvp.Key,
        kvp => kvp.Value.Errors.Select(e => e.ErrorMessage).ToArray()
    );