1
votes

L'élément en double est ajouté à la liste

J'essaie d'envoyer une liste de chaînes à l'API Web et cette liste que j'initialise dans le constructeur de classe et la même classe que je transmets à l'API Web.

Quand j'initialise la classe; La liste se remplit correctement, mais après l'avoir envoyée à l'API Web, les mêmes éléments sont à nouveau ajoutés à la liste. Je ne sais pas pourquoi cela se produit.

Comme j'accepte ces valeurs du client; Si aucune valeur n'est fournie par le client, je souhaite remplir la valeur par défaut dans la liste.

Voici mon code

RequestDto objrequestdto = GetConfigurations(configName);

private RequestDto GetConfigurations(string configName)
        {

            RequestDto requestdto = new RequestDto();

            /// Add configurations here.

            return requestdto;
        }

et je suis passer la classe à l'API Web comme ci-dessous

[HttpPost]
        public IActionResult GetTypeDetails([FromBody] RequestDto requestdto) // Here I am getting duplicate/Repeated Values
        {
            try
            {
                // Some logic

            }
            catch (Exception e)
            {
                Log.Error("Some Error");
                return StatusCode(500, e.Message);
            }
        }

et ci-dessous est mon API où, après avoir reçu le paramètre, je peux voir que les éléments sont à nouveau ajoutés.

using (var client = new HttpClient())
            {
                string url = "some url";

                var postTask = client.PostAsJsonAsync(url, objrequestdto);
                postTask.Wait();

                if (postTask.Result.IsSuccessStatusCode)
                {
                    // Do Something
                }
            }

Voici comment je remplis la classe RequestDto avant d'appeler l'API Web.

EDIT 1:

public class RequestDto
    {
        public RequestDto()
        {
            TypeNames = new List<string>();
            TypeNames.Add(new string("Type1"));
            TypeNames.Add(new string("Type2"));
            TypeNames.Add(new string("Type3"));

        }

        public string CompanyName { get; set; }
        public string Version { get; set; }
        public List<string> TypeNames { get; set; }
    }

Pour cette raison, je reçois des enregistrements en double dans l'API Web.

Toute aide à ce sujet est appréciée!


4 commentaires

ceci est normal si l'objet que vous envoyez est le même que l'objet que vous envoyez.


Cela ne se produit pas après la sérialisation au point de terminaison du client, cela a à voir avec la façon dont vous créez objrequestdto , fournissez ce code et aussi pourquoi appelez-vous la méthode Async de manière synchrone


@MrinalKamboj J'ai édité la question et ajouté le code


@MrinalKamboj Lorsque j'appelle l'API Web, il appelle à nouveau le constructeur


3 Réponses :


2
votes

C'est parce que vous ajoutez les valeurs dans le constructeur.


3 commentaires

@Own Pauling Alors comment dois-je ajouter les valeurs par défaut en cas d'absence de valeurs du client?


J'ai même essayé de définir directement la propriété de la liste au lieu du constructeur, mais les valeurs en double sont toujours ajoutées


Ce ne sera pas le défi, puisque dans le constructeur OP est également en train de réinitialiser TypeNames = new List ();



1
votes

Vous utilisez le constructeur par défaut pour ajouter les valeurs par défaut, qui est également utilisé par Serializer. Serializer appellera d'abord votre constructeur par défaut, puis il remplira les éléments du JSON.

Pour éviter la duplication, vous pouvez utiliser ISet au lieu de List code>.

public class RequestDto
{
    public RequestDto()
    {
        TypeNames = new HashSet<string>();
        TypeNames.Add(new string("Type1"));
        TypeNames.Add(new string("Type2"));
        TypeNames.Add(new string("Type3"));
    }

    public string CompanyName { get; set; }
    public string Version { get; set; }
    public ISet<string> TypeNames { get; set; }
}


0 commentaires

1
votes

Si quelqu'un cherche la réponse, je l'ai résolue en ajoutant le formatage json ci-dessous dans le fichier Startup.cs du projet API Web.

services.AddMvc().AddJsonOptions(options =>
            {
                options.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;
                options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
                options.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
                options.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local;
                options.SerializerSettings.ObjectCreationHandling = Newtonsoft.Json.ObjectCreationHandling.Replace;
            });

Cela a résolu le problème pour moi. p>


0 commentaires