private static IEnumerable <ModelState> GetFaultedModelStates(ModelStateDictionary modelState, string[] groupNames, object model)
        {
            var props = GetPropertyMap(string.Empty, model, new List <object>());
            IEnumerable <string> validatedPropertyNames = props
                                                          .Where(pdm => pdm.Property.Attributes.OfType <ValidationGroupAttribute>()
                                                                 .Where(vg => groupNames.Intersect(vg.GroupNames, StringComparer.OrdinalIgnoreCase).Any()).Any()
                                                                 ).Select(pd => pd.Key).ToArray();
            IEnumerable <ModelState> faulted = modelState.Where(ms => validatedPropertyNames.Contains(ms.Key) && !modelState.IsValidField(ms.Key)).Select(ms => ms.Value).ToArray();

            return(faulted);
        }
        public static string[] GetErrors(this ModelStateDictionary modelState, string prefix)
        {
            if (!modelState.IsValid)
            {
                List <string> errors = new List <string>();

                IEnumerable <KeyValuePair <string, ModelState> > states =
                    prefix.IsNullOrEmpty() ? modelState.AsEnumerable()
                    : modelState.Where(x => x.Key.StartsWith(prefix + "."));

                foreach (var modelStateKvp in states)
                {
                    foreach (var modelError in modelStateKvp.Value.Errors)
                    {
                        errors.Add(modelError.ErrorMessage);
                    }
                }

                return(errors.ToArray());
            }

            return(null);
        }
        public static Dictionary <string, string[]> ToErrorList(this ModelStateDictionary modelState)
        {
            var func = new Func <ModelError, string>(state =>
            {
                var str = string.Empty;
                if (!string.IsNullOrEmpty(state.ErrorMessage))
                {
                    str += state.ErrorMessage;
                }
                if (state.Exception != null)
                {
                    str += (!string.IsNullOrEmpty(str) ? " " : "") + state.Exception.Message;
                }

                return(str);
            });

            var d = modelState
                    .Where(kvp => kvp.Value.Errors.Count > 0)
                    .ToDictionary(kvp => String.IsNullOrWhiteSpace(kvp.Key) ? String.Empty : kvp.Key,
                                  kvp => kvp.Value.Errors.Select(e => func(e)).ToArray());

            return(d);
        }
 /// <summary>
 /// Removes all the elements except those with keys matching keys in the <paramref name="includes"/> list.
 /// </summary>
 /// <param name="modelState"></param>
 /// <param name="includes"></param>
 public static void RemoveAllBut(this ModelStateDictionary modelState, params string[] includes)
 {
     modelState.Where(x => !includes.Any(i => String.Compare(i, x.Key, true) == 0)).ToList().ForEach(k => modelState.Remove(k));
 }