私は次のように CategoryViewModel を持っています:
public class CategoryViewModel
{
public string Id {get; set;}
public string Name { get; set; }
public IEnumerable<SelectListItem> Products { get; set; }
public List<string> SelectedProductIds { get; set; }
}
CategoryController の GET メソッドは、この CategoryViewModel を使用してオブジェクトをインスタンス化し、すべての製品をこの CategoryViewModel オブジェクトに追加します。次に、すべての製品を繰り返し処理し、カテゴリ オブジェクトに含まれる製品の Selected プロパティを True に設定します。
public ActionResult CategoryController(string categoryId)
{
CategoryDbContext db = new CategoryDbContext();
CategoryRepository CategoryRepo = new CategoryRepository(db);
ProductRepository ProductRepo = new ProductRepository(db);
Category category = CategoryRepo.GetCategory(categoryId);
CategoryViewModel categoryView = new CategoryViewModel()
{
Id = category.Id,
Name = category.Name,
Products = from product in ProductRepo.GetAllProducts()
select new SelectListItem { Text = product.Name, Value = product.Id, Selected = false}
};
foreach (var product in category.Products)
{
categoryView.Products.Where(x => x.Value == product.Id).FirstOrDefault().Selected = true;
}
return View(categoryView);
}
デバッガーを使用して、foreach が実行されることを観察しますが、categoryView には Selected プロパティが False に設定されたままのすべての Products があります。
ただし、これは正常に機能します。
public ActionResult CategoryController(string categoryId)
{
CategoryDbContext db = new CategoryDbContext();
CategoryRepository CategoryRepo = new CategoryRepository(db);
ProductRepository ProductRepo = new ProductRepository(db);
Category category = CategoryRepo.GetCategory(categoryId);
CategoryViewModel categoryView = new CategoryViewModel()
{
Id = category.Id,
Name = category.Name,
Products = from product in ProductRepo.GetAllProducts()
select new SelectListItem { Text = product.Name, Value = product.Id, Selected = category.Products.Contains(product)}
};
return View(categoryView);
}
誰かが違いを説明し、最初のものが機能しない理由を教えてください。
編集: 私はEF 6を使用しており、製品とカテゴリは多対多の関係でデータベースに保存されています。