Конвертировать ModelState в JSON для ведения журнала - PullRequest
0 голосов
/ 24 августа 2018

Как мне преобразовать ModelState в JSON в том же формате, что и ASP.NET Core?

Я знаю, что могу сделать BadRequest(ModelState), и он вернет JSON клиенту. Как конвертировать ModelState в JSON? И что еще более важно, как я могу использовать то, что он использует ?

Моя цель - записать ModelState как JSON в наши "файлы" журналов.

т.е. var blah = ModelState.ToJson()

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Как конвертировать ModelState в JSON?

Класс SerializableError обеспечивает эту функциональность.

И что более важно, как я могу использовать то, что он использует?

//get key(s) and error message(s) from the ModelState
var serializableModelState = new SerializableError(ModelState);

//convert to a string
var modelStateJson = JsonConvert.SerializeObject(serializableModelState);

//log it
logger.Information("Bad Category Model State", modelStateJson);

Пример вывода

{
    "Name": ["The Name field is required."]
}

Мне удалось выяснить это, покопавшись в исходном коде ASP.NET Core MVC . Интересная часть исходного кода из SerializableError класса:

foreach (var keyModelStatePair in modelState)
{
    var key = keyModelStatePair.Key;
    var errors = keyModelStatePair.Value.Errors;
    if (errors != null && errors.Count > 0)
    {
        var errorMessages = errors.Select(error =>
        {
            return string.IsNullOrEmpty(error.ErrorMessage) ?
                Resources.SerializableError_DefaultError : error.ErrorMessage;
        }).ToArray();

        Add(key, errorMessages);
    }
}
0 голосов
/ 25 августа 2018

Просто чтобы получить список сообщений об ошибках для каждого свойства модели, которое не прошло проверку, так, как вы хотите, как указано выше, с использованием метода расширения.то есть ModelState.ToJson(), вам нужно создать статический класс со статической функцией ToJson(...).Пример кода будет выглядеть примерно так:

public static class ModelStateExtensions
{
    /// <summary>
    /// Reads all the error messages in a <see cref="ModelStateDictionary"/> as 
    /// a collection and returns a JSON <see cref="string"/> of the list.
    /// </summary>
    /// <param name="modelstate">Current modelstate assuming that you've checked
    /// and confirmed that is Invalid using <see 
    /// cref="ModelStateDictionary.IsValid"/>
    /// </param>
    /// <returns>
    /// Collection of validation errors for the model as a JSON string.
    /// </returns>
    public static string ToJson(this ModelStateDictionary modelstate)
    {
        List<string> errors = modelstate.Values
                                        .SelectMany(x => x.Errors)
                                        .Select(x => x.ErrorMessage)
                                        .ToList();
        return JsonConvert.SerializeObject(errors);
    }
}

Свойство ModelState на каждом контроллере обычно равно ModelStateDictionary, поэтому, если нам нужен дополнительный метод для него, это класс, который нам нуженрасширить.Вы можете узнать больше о методах расширения в C #, следуя этой Link .

Давайте теперь посмотрим, как использовать наш метод расширения в образце действия контроллера:

public IActionResult Create(UserViewModel model)
{
    if(!ModelState.IsValid)
    {
        string json = ModelState.ToJson();

        // insert code to log json to file here

        return BadRequest(ModelState);
    }
}
...