none
ASP.NET Core, Problème de session RRS feed

  • Discussion générale

  • Bonjour,

    je suis bloqué depuis deux jours sur un projet ASP.NET Core car HttpContext.Session me renvoie deux sessions différentes (pas le même Id) dans deux procédures d'un même controller. J'ai bien suivi les multiples tutos que l'on peut trouver sur Internet mais sans résultat. Si quelqu'un pouvait m'aider...

    Précision :

    L'appel à la première procédure se fait par un $get juste avant le submit et le second au submit de la form.

    J'essaie de passer des paramètres en tre procédure mais rien ne marche, j'ai toujours des nulls, que ce soit par HttpContext.Session, le ViewBag, les variables, TempData,...

    mardi 13 juin 2017 15:15

Toutes les réponses

  • Bonjour rvs7557,
    Pour que la communauté puisse vous aider au mieux possible, c'est toujours utile de donner plus d'informations. Par exemple une erreur obtenue ou une partie de votre code qui provoque le problème.

    Cordialement,
    Nina


    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mercredi 14 juin 2017 13:17
    Modérateur
  • Le code Javascript avant le submit :

        $(function () {
    
            $('#formCreate').submit(function (event) {
    
                event.preventDefault(); //arrete le submit
                var correct = true;
                var promesses = [];
                $('#checkboxes input:checked').each(function () {//recupère tous les checkbox checked
                    promesses.push($(this).attr('value'));//mets les values dans l'array'
                });
    
                var zone = $('#Zones option:selected').val();
    
                if (zone.length == 0) {
                    correct = false;
                }
    
                if (promesses.length == 0) {// au moins une promesse
                    correct = false;
                }
                if (correct) {
                    $.get('/SessionEnquetes/SauverPromessesZonePourSessionEnCours', $.param({ listpromesses: promesses, zone: zone }, true), function (listpromesses, zone) { });
                    $(this).unbind('submit').submit(); // continue le submit
    
                } else {
                    alert("Il n'a pas de zone ou de promesse selectionnée.");
                }
    
            })
    
        });

    Le code appelé par le javascript

            public SessionEnquetesController(PPTContext context)
            {
                _context = context;    
            }
            public void SauverPromessesZonePourSessionEnCours (List<int> listpromesses, int zone)
            {
                string tttt = string.Join(",", listpromesses);
                //HttpContext.Session.SetString("ListePromesse",tttt);
                TempData["ListPromesses"] = tttt;
                //listePromesse = tttt;
                //HttpContext.Session.SetInt32("ZoneEncours", zone);
                string listZone;
                bool estZoneParent = (from z in _context.EtreParent where z.ZoneParcoursId == zone select z).Count() > 0;
                if (estZoneParent)
                {
                 listZone= string.Join(",", from z in _context.EtreParent where z.ZoneParcoursId == zone select z.ZoneParcoursId1);
                }
                else
                {
                    listZone = zone.ToString();
                }
                //HttpContext.Session.SetString("ZoneEncours", listZone);
                //ViewBag.ZoneEncours = listZone;
                TempData["zoneEncours"] = listZone;
            }

    Et le Create au submit :

            public async Task<IActionResult> Create([Bind("SessionEnqueteId,NomEnquete,Animateur,DateHeureDebut,DateHeureFin,RemarqueEnquete,Lieu")] SessionEnquetes sessionEnquetes)
            {
                if (ModelState.IsValid)
                {
                    _context.Add(sessionEnquetes);
                    await _context.SaveChangesAsync();
                    //Mise en cache de l'dentifiant de la sessionenquete pour toutes les pages de l'enquete.
                    int idEnquete = sessionEnquetes.SessionEnqueteId;
                    HttpContext.Session.SetInt32("IdEnqueteEnCours", idEnquete);
                    HttpContext.Session.SetString("ListePromesse", (string)TempData["ListPromesses"]);
                    HttpContext.Session.SetString("ZoneEncours", (string)TempData["zoneEncours"]);
                    //string titi = HttpContext.Session.GetString("ListePromesse");
                    //titi.ToUpper();
                    //string[] Idpromesse = listePromesse.Split(',');
                    string[] Idpromesse = ((string)TempData["ListPromesses"]).Split(',');
                    //Sauvegarde des promesses pour la session en cours
                    foreach (string idp in Idpromesse)
                    {
                        Concerner con = new Concerner { PromesseId = int.Parse(idp), SessionEnqueteId = idEnquete };
                        _context.Add(con);
                        //await _context.SaveChangesAsync();
                    }
                    await _context.SaveChangesAsync();
                    return RedirectToAction("Create", "Repondres");
                    //return RedirectToAction("Index");
                }
                //autre code
            }
    DAns ce dernier bout de code toutes mes tentative pour récupérer la liste des promesses se sont soldé par un null.


    • Modifié rvs7557 mercredi 14 juin 2017 13:38
    mercredi 14 juin 2017 13:35
  • Bonjour,

    A priori, dans votre code javascript, vous ne maitrisez pas l'ordre d'appel des 2 méthodes du controller.

    Je pense qu'il y a un pb de conception de votre formulaire : pourquoi ne faites vous pas tout le code dans une même méthode du controller ? Au moins, vous êtes sur du résultat.

    NB: L'utilisation de Session, c'est à éviter le plus possible.


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    jeudi 15 juin 2017 08:16
  • Le problème est que j'ai déjà un base de donnée existante, une maquette à respecter et un temps très limité.

    Je me retrouve donc à devoir connaitre l'id de la sessionEnquete ainsi que les id des zones  tout au long de l'enquête. Les variables sessions aurait été l'idéal, si HttpContext.Session était constant...

    jeudi 15 juin 2017 09:18
  • Bonjour,

    Si vous avez deux sessions différentes, c'est qu'il y a une très forte probabilité pour que l'identifiant de la session ne soit pas transmis. Comment l'est-il ? Par un paramètre GET ? Par un cookie ?

    Je vous invite à vérifier les requêtes émises par le navigateur via les outils développeur (F12 généralement) pour confirmer l'absence de l'identifiant de la session.

    Car sans cela, côté serveur, impossible de savoir si 2 requêtes sont "liées". Ce qui explique qu'aucune de vos tentatives n'a pour l'instant abouti.

    jeudi 15 juin 2017 10:24
  • En forçant la création d'un identifiant de session dans le Create() du Controller, ça marche. Le $get du script ne permet pas le renvoi de l'id de session.

    Pour l'instant je fait un setInt32 bidon, mais je regarde s'il y a un autre moyen initialiser correctement le HttpContext.Session.

    jeudi 15 juin 2017 11:47