Преобразование ModelState в JSON для ведения журнала

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

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

Моя цель - зарегистрировать ModelStateJSON в наших журнальных файлах.

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

c#,json,logging,asp.net-core,

0

Ответов: 2


1

Просто чтобы получить список сообщений об ошибках для каждого свойства модели, которые не прошли проверку, как вы указали, как указано выше, используя метод расширения. т.е. 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 #, следуя этой ссылке .

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

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

        // insert code to log json to file here

        return BadRequest(ModelState);
    }
}

1 принят

Как он преобразует ModelState в JSON?

Класс обеспечивает такую функциональность.//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."]
}

Образец вывода

SerializableError

Я смог понять это, копая исходный код 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);
    }
}
C #, JSON, каротаж, asp.net-ядро,
Похожие вопросы