Изменить BuildApiResponse в ASP.Net Web Api - PullRequest
0 голосов
/ 20 февраля 2019

Я новичок в ASP.NET MVC Web API.Я пытаюсь изменить возвращаемый JSon в этот формат

{
  "Error": false,
  "Status": 200,
  "Response": []
}

Теперь я могу сделать это, следуя этому сообщению https://www.devtrends.co.uk/blog/wrapping-asp.net-web-api-responses-for-consistency-and-to-provide-additional-information.Но проблема в том, что я не могу показать ошибку ModelState, например «Имя необходимо», потому что код показывает только ошибку первого попадания.

        if (error != null)
        {
            content = null;
            //only show the first error
            errorMessage = error.Message;

        }

Итак, я сделал некоторую модификацию, теперь код написан так:

            if (error != null)
            {
                content = null;
                foreach(var e in error)
                {
                    //if the error's type is ModelState 
                    if (e.Key.Equals("ModelState"))
                    {
                        var allErrors = e.Value;
                        foreach (var modelError in (IEnumerable<KeyValuePair<string, object>>)allErrors)
                        {
                            var msg = modelError;

                            errorMessage = string.Concat(errorMessage, ", ", ((String[]) modelError.Value)[0]);
                        }
                    }
                    else
                    {
                        errorMessage = e.Value.ToString();
                    }
                }
            }

Теперь он может отображать все ошибки, но код не очень корректный.Я пишу эти вопросы, чтобы узнать, как правильно написать код такого рода.

1 Ответ

0 голосов
/ 25 февраля 2019

Вы можете перебрать все ошибки и объединить их с помощью StringBuilder.String.Join намного быстрее, чем Append, для менее чем 1000 элементов (маловероятно, что у вас будет так много ошибок в объекте состояния модели):

public static ValidationResult CheckValid(ModelStateDictionary modelState, string httpName = null)
    {
        if (!modelState.IsValid)
        {
            var sb = new StringBuilder();
            sb.AppendLine(httpName + " failed: Invalid Json:");
            foreach (var pair in modelState)
            {
                var error = String.Join(";", pair.Value.Errors.Select
                    (
                        i =>
                        {
                            if (!String.IsNullOrEmpty(i.ErrorMessage))
                                return i.ErrorMessage;
                            return i.Exception.Message;
                        }
                    ));
                sb.AppendLine($"Property: {pair.Key} Errors: ({error})");
            }
            return new ValidationResult(false, sb.ToString());
        }
        else
            return new ValidationResult(true, "");
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...