8 votes

Convertir ModelState en JSON pour la journalisation

Comment puis-je convertir ModelState à JSON dans le même format que ASP.NET Core ?

Je sais que je peux faire BadRequest(ModelState) et il retournera JSON au client. Comment convertit-il ModelState en JSON ? Et plus important encore, comment puis-je utiliser ce qu'il utilise ?

Mon objectif est d'enregistrer le ModelState en tant que JSON dans nos "fichiers" d'enregistrement.

c'est-à-dire var blah = ModelState.ToJson()

12voto

spottedmahn Points 4439

Comment convertit-il ModelState en JSON ?

El SerializableError La classe fournit cette fonctionnalité.

Et surtout, comment puis-je utiliser ce qu'il utilise ?

using Microsoft.AspNetCore.Mvc;
using Newtonsoft.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.LogInformation("Bad Model State", modelStateJson);

Exemple de sortie

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

J'ai pu comprendre cela en creusant dans la section Code source ASP.NET Core MVC . La partie intéressante de code source de la SerializableError classe :

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);
    }
}

1voto

machariadev Points 945

Il suffit d'obtenir une liste des messages d'erreur pour chaque propriété de modèle qui a échoué la validation de la manière que vous voulez comme indiqué ci-dessus en utilisant une méthode d'extension, c'est à dire ModelState.ToJson() vous devez créer un statique avec une fonction statique ToJson(...) . L'exemple de code ressemblera à ceci.

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);
    }
}

El ModelState de chaque contrôleur est normalement un ModelStateDictionary Donc, si nous voulons une méthode supplémentaire, c'est la classe que nous devons étendre. Vous pouvez en apprendre davantage sur les méthodes d'extension en C# en suivant ce qui suit Lien .

Voyons maintenant comment utiliser notre méthode d'extension dans un exemple d'action de contrôleur :

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

        // insert code to log json to file here

        return BadRequest(ModelState);
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X