こんにちは。
ASP.NET Coreについて初学者なので拙いところもあると思いますが、よろしくお願いします。
実現したいこと
具体例でお話しします。
例えばAnimalとPlantいうModelがあり、それを元にスキャフォールディングしたViewとControllerが存在しているとします。
この時データベースにはDbInitializerで追加した初期データか、実際にブラウザ上でCreateしたデータが入っています。
その後、AnimalとPlantという2つのModelを元にしてLivingViewModelを作成するとします。
C#
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Threading.Tasks; 5 6 7namespace WebApplication.Models 8{ 9 public class LivingViewModel 10 11 { 12 public IEnumerable<Animal> Animals { get; set; } 13 public IEnumerable<Plant> Plants { get; set; } 14 } 15}
このとき、AnimalもしくはPlantのページで追加したデータや初期データをViewModelのページに反映させる、またLivingViewModelの方で編集したデータをAnimalもしくはPlantのページに反映させるControllerの書き方がわかりません。
以下AnimalのControllerです。
C#
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Threading.Tasks; 5using Microsoft.AspNetCore.Mvc; 6using Microsoft.AspNetCore.Mvc.Rendering; 7using Microsoft.EntityFrameworkCore; 8using WebApplication.Data; 9using WebApplication.Models; 10 11namespace WebApplication.Controllers 12{ 13 public class AnimalsController : Controller 14 { 15 private readonly MyDbContext _context; 16 17 public AnimalsController(MyDbContext context) 18 { 19 _context = context; 20 } 21 22 // GET: Animals 23 public async Task<IActionResult> Index() 24 { 25 return View(await _context.Animals.ToListAsync()); 26 } 27 28 // GET: Animals/Details/5 29 public async Task<IActionResult> Details(int? id) 30 { 31 if (id == null) 32 { 33 return NotFound(); 34 } 35 36 var Animal = await _context.Animals 37 .FirstOrDefaultAsync(m => m.Id == id); 38 if (Animal == null) 39 { 40 return NotFound(); 41 } 42 43 return View(Animal); 44 } 45 46 // GET: Animals/Create 47 public IActionResult Create() 48 { 49 return View(); 50 } 51 52 // POST: Animals/Create 53 // To protect from overposting attacks, please enable the specific properties you want to bind to, for 54 // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 55 [HttpPost] 56 [ValidateAntiForgeryToken] 57 public async Task<IActionResult> Create([Bind("Id,Name")] Animal Animal) 58 { 59 if (ModelState.IsValid) 60 { 61 _context.Add(Animal); 62 await _context.SaveChangesAsync(); 63 return RedirectToAction(nameof(Index)); 64 } 65 return View(Animal); 66 } 67 68 // GET: Animals/Edit/5 69 public async Task<IActionResult> Edit(int? id) 70 { 71 if (id == null) 72 { 73 return NotFound(); 74 } 75 76 var Animal = await _context.Animals.FindAsync(id); 77 if (Animal == null) 78 { 79 return NotFound(); 80 } 81 return View(Animal); 82 } 83 84 // POST: Animals/Edit/5 85 // To protect from overposting attacks, please enable the specific properties you want to bind to, for 86 // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 87 [HttpPost] 88 [ValidateAntiForgeryToken] 89 public async Task<IActionResult> Edit(int id, [Bind("Id,Name")] Animal Animal) 90 { 91 if (id != Animal.Id) 92 { 93 return NotFound(); 94 } 95 96 if (ModelState.IsValid) 97 { 98 try 99 { 100 _context.Update(Animal); 101 await _context.SaveChangesAsync(); 102 } 103 catch (DbUpdateConcurrencyException) 104 { 105 if (!AnimalExists(Animal.Id)) 106 { 107 return NotFound(); 108 } 109 else 110 { 111 throw; 112 } 113 } 114 return RedirectToAction(nameof(Index)); 115 } 116 return View(Animal); 117 } 118 119 // GET: Animals/Delete/5 120 public async Task<IActionResult> Delete(int? id) 121 { 122 if (id == null) 123 { 124 return NotFound(); 125 } 126 127 var Animal = await _context.Animals 128 .FirstOrDefaultAsync(m => m.Id == id); 129 if (Animal == null) 130 { 131 return NotFound(); 132 } 133 134 return View(Animal); 135 } 136 137 // POST: Animals/Delete/5 138 [HttpPost, ActionName("Delete")] 139 [ValidateAntiForgeryToken] 140 public async Task<IActionResult> DeleteConfirmed(int id) 141 { 142 var Animal = await _context.Animals.FindAsync(id); 143 _context.Animals.Remove(Animal); 144 await _context.SaveChangesAsync(); 145 return RedirectToAction(nameof(Index)); 146 } 147 148 private bool AnimalExists(int id) 149 { 150 return _context.Animals.Any(e => e.Id == id); 151 } 152 } 153} 154
AnimalやPlantのデータとは関係なくLivingViewModelに初期データを追加することは出来るのですが、相互に作用できるようにしたいです。
以下現在のViewModelのControllerです。
C#
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Threading.Tasks; 5using Microsoft.AspNetCore.Mvc; 6using Microsoft.EntityFrameworkCore; 7using WebApplication.Data; 8using WebApplication.Models; 9 10namespace WebApplication.Controllers 11{ 12 public class LivingViewModelsController : Controller 13 { 14 15 public IActionResult Index() 16 { 17 LivingViewModel myView = new LivingViewModel(); 18 myView.Animals = GetAnimals(); 19 myView.Plants = GetPlants(); 20 return View(myView); 21 } 22 23 private List<Animal> GetAnimals() 24 { 25 List<Animal> Animals = new List<Animal>(); 26 Animals.Add(new Animal { /*初期データ*/ }); 27 return Animals; 28 29 } 30 31 private List<Plant> GetPlants() 32 { 33 List<Plant> Plants = new List<Plant>(); 34 Plants.Add(new Plant { /*初期データ*/ }); 35 36 return Plants; 37 } 38 } 39} 40
DbContext、DbInitializerは以下の通りです。
C#
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Threading.Tasks; 5using DBAccessSample.Models; 6using Microsoft.EntityFrameworkCore; 7 8namespace WebApplication.Data 9{ 10 public class MyDbContext : DbContext 11 { 12 public MyDbContext(DbContextOptions<MyDbContext> options) : base(options) { } 13 14 public DbSet<Animal> Animals { get; set; } 15 16 public DbSet<Plant> Plants { get; set; } 17 } 18} 19
C#
1sing System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Threading.Tasks; 5using WebApplication.Models; 6using Microsoft.EntityFrameworkCore; 7 8namespace WebApplication.Data 9{ 10 public class DbInitializer 11 { 12 public static void Initialize(MyDbContext context) 13 { 14 context.Database.EnsureCreated(); 15 16 if (context.ProgressTables.Any()) 17 { 18 return; // DB has been seeded 19 } 20 21 //Animal 22 var animals = new Animal[] 23 { 24 new Animal{ 25 //初期データ 26 } 27 28 }; 29 foreach (var tmp in animals) 30 { 31 context.Animals.Add(tmp); 32 } 33 context.SaveChanges(); 34 35 //Plant 36 var plants = new Plant[] 37 { 38 new Plant{ 39 //初期データ 40 } 41 42 }; 43 foreach (var tmp in plants) 44 { 45 context.Plants.Add(tmp); 46 } 47 context.SaveChanges(); 48 } 49 } 50}
疑問点が不明瞭で分かりにくいかと思いますが、よろしくお願いします。
参考URL
https://tech-blog.cloud-config.jp/2019-09-10-create-a-netcore-webapp-loosely-and-easily-part1/
https://qiita.com/KktkiY/items/f28528916e97310262e0
補足情報(FW/ツールのバージョンなど)
Visual Studio 2017 Community
Microsoft.AspNetCore.All 2.2.8
Windows10 Pro 1909
回答2件
あなたの回答
tips
プレビュー