Ik zit te worstelen met MVC 5 in combinatie met Entity Framework 6.
Ik heb een database met Leagues en LeagueMembers (gebruikers die lid zijn van een League). Dit zijn de models:
Er kunnen meerdere gebruikers zijn die allemaal hun eigen Leagues aanmaken (en daar Owner van zijn).
Bij het wijzigen van een League (met een Edit action) moet er gevalideerd worden dat de huidige gebruiker genoeg rechten heeft om die League te wijzigen. Dit gebeurt twee keer: (1) eerst in de GET request naar de Edit pagina, en daarna nog eens in de POST request van de Edit pagina.
Het probleem is dat de check in (1) goed gaat, en in (2) niet, omdat de 'Members' navigational property dan ineens null is geworden. In de GET request is de Members property niet null en bevat hij de juiste members, maar zodra ik op de Edit knop klik op de edit pagina (en dus naar de POST request spring) is hij null en gaat de validatie dus elke keer mis (er zijn geen members dus de huidige gebruiker kan nooit genoeg rechten hebben).
Dit zijn de twee Edit methods in de controller. Ik heb in beide een Debug.Assert toegevoegd die controlleert of de Members property null is. In de eerste method (GET) is dat niet zo (klopt dus), in de tweede is hij wel null...
Ik snap niet waar dit door komt. Heeft het met lazy loading te maken? En zo ja, waarom gaat het dan wel goed in de GET maar niet in de POST?
Ik heb een database met Leagues en LeagueMembers (gebruikers die lid zijn van een League). Dit zijn de models:
C#:
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
| public class League : BaseModel { [Required] public string LeagueName { get; set; } public virtual ICollection<LeagueMember> Members { get; set; } } public class LeagueMember : BaseModel { [Required] public virtual ApplicationUser User { get; set; } [Required] public string UserId { get; set; } [Required] public virtual League League { get; set; } [Required] public int LeagueId { get; set; } [Required] public bool IsOwner { get; set; } [Required] public int AdminLevel { get; set; } } |
Er kunnen meerdere gebruikers zijn die allemaal hun eigen Leagues aanmaken (en daar Owner van zijn).
Bij het wijzigen van een League (met een Edit action) moet er gevalideerd worden dat de huidige gebruiker genoeg rechten heeft om die League te wijzigen. Dit gebeurt twee keer: (1) eerst in de GET request naar de Edit pagina, en daarna nog eens in de POST request van de Edit pagina.
Het probleem is dat de check in (1) goed gaat, en in (2) niet, omdat de 'Members' navigational property dan ineens null is geworden. In de GET request is de Members property niet null en bevat hij de juiste members, maar zodra ik op de Edit knop klik op de edit pagina (en dus naar de POST request spring) is hij null en gaat de validatie dus elke keer mis (er zijn geen members dus de huidige gebruiker kan nooit genoeg rechten hebben).
Dit zijn de twee Edit methods in de controller. Ik heb in beide een Debug.Assert toegevoegd die controlleert of de Members property null is. In de eerste method (GET) is dat niet zo (klopt dus), in de tweede is hij wel null...
C#:
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
| // GET: /League/Edit/5 [Authorize] public ActionResult Edit(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } League league = Database.Leagues.Find(id); if (league == null) { return HttpNotFound(); } // TEST: ------------------------------ Debug.Assert(league.Members != null); // Resultaat: league.Members is hier NIET null - ok! // ------------------------------------ // Authenticate - check if user is league admin var user = UserManager.FindById(User.Identity.GetUserId()); if (!user.IsLeagueAdmin(league, AdminLevels.EditLeague)) { return new HttpStatusCodeResult(HttpStatusCode.Unauthorized); } return View(league); } // POST: /League/Edit/5 [HttpPost] [ValidateAntiForgeryToken] [Authorize] public ActionResult Edit([Bind(Include="Id,LeagueName,Description,Website,AccessType,Password,CreatedTime,UpdatedTime")] League league) { if (ModelState.IsValid) { // TEST: ------------------------------ Debug.Assert(league.Members != null); // Resultaat: league.Members is hier NULL! - Fout! // ------------------------------------ // Authenticate - check if user is league admin var user = UserManager.FindById(User.Identity.GetUserId()); if (!user.IsLeagueAdmin(league, AdminLevels.EditLeague)) { return new HttpStatusCodeResult(HttpStatusCode.Unauthorized); } Database.Entry(league).State = EntityState.Modified; Database.SaveChanges(); return RedirectToAction("Index"); } return View(league); } |
Ik snap niet waar dit door komt. Heeft het met lazy loading te maken? En zo ja, waarom gaat het dan wel goed in de GET maar niet in de POST?