J'ai un dictionnaire comme ci-dessous

Dictionary<Tuple<int, int>, bool> sampleDict= new Dictionary<Tuple<int, int>, bool>();

Que j'ai ajouté en session

if (!IsPostBack)
{
   HttpContext.Current.Session.Add("SessionsampleDict", sampleDict);
}

MAINTENANT, je dois ajouter des valeurs dans le dictionnaire, donc mon code va comme.

sampleDict.Add(DictKey, true);

Le problème MAINTENANT est que lorsque je reviens sur ma page en utilisant la publication, je perds toutes mes données dans sampleDict.

Qu'est-ce que je fais mal ici? Comment ajouter des valeurs de dictionnaire en session?

1
user1197114 27 janv. 2017 à 12:29

4 réponses

Meilleure réponse

sampleDict ne sera pas en session, seules ses valeurs sont copiées dans la session. Vous devez réaffecter la valeur à la variable de session après les avoir modifiées. ou bien vous pouvez essayer comme ceci:

((Dictionary<Tuple<int, int>, bool>)HttpContext.Current.Session["SessionsampleDict"]).Add(DictKey, true);
3
sujith karivelil 17 juil. 2019 à 14:12

J'imagine que lorsque vous ajoutez le sampleDict à votre session, vous en faites une copie et le stockez, donc lorsque vous appelez

sampleDict.Add(...)

Il ne met pas à jour celui de votre session.

Vous devrez peut-être mettre à jour celui de votre session à chaque fois que vous mettez à jour l'autre, ou trouver un moyen de ne manipuler que celui de votre session.

sampleDict.Add(...);
HttpContext.Current.Session["SessionsampleDict"] = sampleDict;

Quelque chose comme ca?

Pas trop familier avec la classe Session mais j'ai fait une estimation approximative. Faites-moi savoir comment ça se passe :)

0
Michael Curry 27 janv. 2017 à 09:39

Essaye ça:

Dictionary<Tuple<int, int>, bool> _sessionDict;
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack || !(Session["SessionsampleDict"] is Dictionary<Tuple<int, int>, bool>))
    {
        Dictionary<Tuple<int, int>, bool> localDict = new Dictionary<Tuple<int, int>, bool>();
        Session["SessionsampleDict"] = localDict;
    }
    _sessionDict = (Dictionary<Tuple<int, int>, bool>)Session["SessionsampleDict"];
}

Vous pouvez maintenant accéder au dictionnaire en utilisant la référence locale _sessionDict ailleurs dans votre page.

3
user1429080 27 janv. 2017 à 09:40

Lorsque vous enregistrez le dictionnaire en session puis que vous modifiez le dictionnaire, l'objet de session ne sera pas mis à jour, car il ne s'agit plus du même objet. La session peut être stockée dans la base de données, redis ou dans un autre stockage, elle n'est donc clonée que sur l'objet d'origine.

0
Tomas Chabada 27 janv. 2017 à 11:07