Sorry voor de wazige titel, ik weet niet goed hoe ik dit moet noemen (en daarom vind ik ook niks online...).
Ik ben bezig met een website in MVC (ASP.NET), waar ik weinig ervaring mee heb (lees: echt alleen de basis) en loop nu tegen een probleem aan waar ik niet omheen kom.
Mijn ervaring met MVC (en dingen die goed gaan) komt neer op: een Model maken wat overeenkomt met een tabel in mijn database, en daar een Controller voor laten genereren die actions als Create, Edit, etc en bijbehorende Views voor maakt. Dit krijg ik allemaal wel voor elkaar als er geen koppeling tussen Models is.
Nu heb ik echter een model wat wel gekoppeld is aan een ander model, en nu loop ik vast.
Ik heb een model 'Series' wat een race series voorstelt (bijvoorbeeld: Formule 1, Formule 2, etc). Binnen een series kunnen er meerdere 'Seasons' bestaan, wat gewoon seizoenen voorstellen. Het Series model heeft dus een collectie Seasons (en een Season heeft een Series als parent).
In de Details view van een Series laat ik dus een lijstje met Seasons zien die bij die Series horen. Daarnaast is er een knopje om een nieuw Season aan te maken. Dit knopje linkt natuurlijk gewoon naar een Create action in de SeasonController.
Het probleem is dat ik niet weet hoe ik de parent Series koppel aan het nieuwe Season.
Ik heb de volgende code in de SeasonController:
Ik geef dus het ID van de parent Series mee naar de Create GET action en check of dat bij een Series hoort. Die Series sla ik op in TempData (dat had ik online geleerd, maar ik heb zo mijn twijfels of dat de juiste manier is) zodat ik die later in de POST action weer kan ophalen.
In de POST action haal ik de Series dus weer op en koppel ik het nieuwe Season aan de Series.
Voor mijn gevoel zou dit moeten werken, maar dat doet het niet. De ModelState is namelijk niet valid, met de melding "The Series field is required".
Hij verwacht dus dat ik ergens op de pagina de Series invul. Waarschijnlijk omdat de Series property in mijn Season model een Required property is? Maar als ik die Required weg haal dan klopt mijn model niet meer, dan kan er namelijk een Season bestaan zonder Series (het Series_Id veld in de database is dan nullable) en dat mag niet...
Wat doe ik hier nu fout? Waarschijnlijk mis ik een fundamenteel iets, maar alle tutorials die ik vind gaan niet verder dan het maken van een simpel losstaand object, en dit soort koppeling met andere models mis ik overal...
Edit
Een poging om het duidelijker en korter te maken:
Ik heb een Series object in de database, en daar wil ik een Season aan toevoegen. Het aanmaken van een nieuw Season object is simpel genoeg, maar de koppeling met een bestaande Series lukt niet.
Ik ben bezig met een website in MVC (ASP.NET), waar ik weinig ervaring mee heb (lees: echt alleen de basis) en loop nu tegen een probleem aan waar ik niet omheen kom.
Mijn ervaring met MVC (en dingen die goed gaan) komt neer op: een Model maken wat overeenkomt met een tabel in mijn database, en daar een Controller voor laten genereren die actions als Create, Edit, etc en bijbehorende Views voor maakt. Dit krijg ik allemaal wel voor elkaar als er geen koppeling tussen Models is.
Nu heb ik echter een model wat wel gekoppeld is aan een ander model, en nu loop ik vast.
Ik heb een model 'Series' wat een race series voorstelt (bijvoorbeeld: Formule 1, Formule 2, etc). Binnen een series kunnen er meerdere 'Seasons' bestaan, wat gewoon seizoenen voorstellen. Het Series model heeft dus een collectie Seasons (en een Season heeft een Series als parent).
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| public class Series : BaseModel { public virtual ICollection<Season> Seasons { get; set; } [Required] public string SeriesName { get; set; } public string Description { get; set; } [Required] public bool IsActive { get; set; } } public class Season : BaseModel { [Required] public virtual Series Series { get; set; } [Required] public int SeasonNumber { get; set; } } |
In de Details view van een Series laat ik dus een lijstje met Seasons zien die bij die Series horen. Daarnaast is er een knopje om een nieuw Season aan te maken. Dit knopje linkt natuurlijk gewoon naar een Create action in de SeasonController.
Het probleem is dat ik niet weet hoe ik de parent Series koppel aan het nieuwe Season.
Ik heb de volgende code in de SeasonController:
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
| // GET: /Season/Create public ActionResult Create(int? seriesId) { // Get parent series if (seriesId == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } Series series = db.Series.Find(seriesId); if (series == null) { return HttpNotFound(); } // Set the series of the new season var season = new Season(); season.Series = series; // Save series in tempdata to retrieve later TempData["Series"] = series; // Pass season to view return View(season); } // POST: /Season/Create [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create([Bind(Include="Id,SeasonNumber,CreatedTime,UpdatedTime,Deleted")] Season season) { if (ModelState.IsValid) { // Get series var series = TempData["Series"] as Series; if (series != null) { // Set series parent season.Series = series; db.Seasons.Add(season); db.SaveChanges(); return RedirectToAction("Details", "Series", new {id = season.Series.Id}); } else { ModelState.AddModelError("NoSeries", "Could not find a series to add the season to."); } } return View(season); } |
Ik geef dus het ID van de parent Series mee naar de Create GET action en check of dat bij een Series hoort. Die Series sla ik op in TempData (dat had ik online geleerd, maar ik heb zo mijn twijfels of dat de juiste manier is) zodat ik die later in de POST action weer kan ophalen.
In de POST action haal ik de Series dus weer op en koppel ik het nieuwe Season aan de Series.
Voor mijn gevoel zou dit moeten werken, maar dat doet het niet. De ModelState is namelijk niet valid, met de melding "The Series field is required".
Hij verwacht dus dat ik ergens op de pagina de Series invul. Waarschijnlijk omdat de Series property in mijn Season model een Required property is? Maar als ik die Required weg haal dan klopt mijn model niet meer, dan kan er namelijk een Season bestaan zonder Series (het Series_Id veld in de database is dan nullable) en dat mag niet...
Wat doe ik hier nu fout? Waarschijnlijk mis ik een fundamenteel iets, maar alle tutorials die ik vind gaan niet verder dan het maken van een simpel losstaand object, en dit soort koppeling met andere models mis ik overal...
Edit
Een poging om het duidelijker en korter te maken:
Ik heb een Series object in de database, en daar wil ik een Season aan toevoegen. Het aanmaken van een nieuw Season object is simpel genoeg, maar de koppeling met een bestaande Series lukt niet.