Bonjour à tous, je me trouve dans une situation assez étrange, je m'explique :

J'ai un objet :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
namespace X
{
   public class Person
   {
      public int Id {get;set;}
      public ICollection<PersonSite> Sites {get;set;}
   }
}
(J'ai raccourci volontairement mon objet pour n'avoir qu'un seul champ interessant.)

Je gère de la pagination sur plusieurs tables en même temps sur la même page (sans JavaScript).

J'ai donc des méthodes du style :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
public ActionResult Sites(int id, int page = 1, int take = 10, string search = null, int order = 1, string sort = null)
        {
            TablePropertiesToSession("PersonSites", page, take, search, sort, order);
            var sites = pManager.PersonSiteManager.Select(predicate:
                personSite => personSite.PersonId == id && (personSite.PersonSiteType.Label.Contains(search) ||
                personSite.Site.FullName.Contains(search)),
                includeProperties: "PersonSiteType").ToList();
            if (Request.IsAjaxRequest())
            {
                return PartialView("../PersonSite/Index", sites);
            }
            else
            {
                TempData.Add("Sites", sites);
                return RedirectToAction("Details", new { id = id });
            }
        }
Puisque la requète n'est pas une requète ajax, je redirect vers l'actio nde base affichant les détails d'une personne.
Cette action est la suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
public ActionResult Details(int id)
        {
            ViewBag.SelectList = ContactController.generateContactComboBox();
            ViewBag.CurrentPersonId = id;
            Person person = pManager.PersonManager.Find(id);
            if (TempData["Services"] != null)
            {
                var list = (ICollection<Service>)TempData["Services"];
                person.Services = list.ToList();
            }
            if (TempData["Groups"] != null)
            {
                var list = (ICollection<PersonGroup>)TempData["Groups"];
                person.Groups = list.ToList();
            }
            if (TempData["Sites"] != null)
            {
                var list = (ICollection<PersonSite>)TempData["Sites"];
                person.Sites = list.ToList();
            }
            if(TempData["OrgUnits"] != null)
            {
                var list = (ICollection<PersonOrganizationalUnit>)TempData["OrgUnits"];
                person.OrganizationalUnits = list.ToList();
            }
            ViewBag.Picture = Url.Content(new ImageManager().GetPersonPicture(person));
            return View("Details", person);
        }
Jusque la, rien d'extraordinaire ... Mais !

Lorsque j'effectue une recherche sur ma table des sites (donc que le paramètre search de la méthode Site est != null),
la variable Sites de cette même méthode contient (par exemple) 1 élément, mais lorsque je dois modifier la valeur de Person.Sites (qui contient par exemple 10 éléments), si je me trouve en débug, l'assignation se fait bien et Person.Sites ne contient plus qu'un élément, par contre, lorsque je ne suis plus en debug, alors cette variable n'est jamais réassignée et reste donc à 10 éléments.

Quelqu'un aurait-il un idée du pourquoi du comment svp ?
Si oui, pourrait-il m'expliquer pourquoi ? Cela fait maintenant quelques jours que je cherche une solution à ce problème et que je ne trouve absolument rien .

Merci de votre aide.

EDIT:
J'ai même remarqué que quelques fois, au lieu que la liste soit remplacée par la nouvelle, celles-ci sont additionnées. Je me retrouve donc avec 2 fois (par exemple) l'élément recherché.

EDIT 2 :
Pour contourner le problème je m'y suis pris autrement (mais cela reste assez moche selon moi...)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
var list = (ICollection<Service>)TempData["Services"];
person.Services = list.ToList();
Devient
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
var list = (ICollection<Service>)TempData["Services"];
person.Services.Clear();
foreach (var service in list)
   person.Services.Add(service);
Si quelqu'un a une idée sur une autre facon de faire, je suis preneur. Je n'aime pas trop devoir parcourir ma liste pour ajouter mes éléments...

Merci