Bonjour à tous, je me trouve dans une situation assez étrange, je m'explique :
J'ai un objet :
(J'ai raccourci volontairement mon objet pour n'avoir qu'un seul champ interessant.)
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;} } }
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 :
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.
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 }); } }
Cette action est la suivante :
Jusque la, rien d'extraordinaire ... Mais !
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); }
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...)
Devient
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 var list = (ICollection<Service>)TempData["Services"]; person.Services = list.ToList();
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...
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);
Merci
Partager