Get、Save、および Create アクションを備えたコントローラーがあります。これらのアクションは、項目タイプをパラメーターとして受け取ります。これは、処理するアイテムのタイプを指定する単なる文字列です。
これらの項目の種類ごとに子コントローラーがあり、これらの子コントローラーのそれぞれは、Get、Save、および Create メソッドを持つ子コントローラー インターフェイス (ICildController) を実装します。
各子コントローラーは、そのタイプ (ItemTypeController) に基づいて名前が付けられます。親コントローラーからアイテムを取得するときは、次のようにできます。
Get(string itemType, int id)
{
return RedirectToAction("Get", itemType, new { id });
}
子コントローラーの Get メソッドには ActionResult 戻り型 (Partival View を返す) があるため、これは問題なく機能します。
ただし、アイテムを保存すると、すべての子が作成され、親オブジェクトに返されてその中に保存されるため、保存は親でのみ実行できます (そして、NHibernate はカスケード レコードを処理します)。
最初にすべての子コントローラーをインスタンス化せずに、これらのメソッドからオブジェクトを返すにはどうすればよいですか。たとえば、Save(itemType, item) を呼び出せるようにしたい
Save(string itemType, Item item)
{
return RedirectToAction("Save", itemType, new { item });
}
次に、適切な子コントローラー (itemTypeController) を見つけ、メソッド Save(item) を実行してから、アイテム (item) を親コントローラーに戻します。
Save(Parent parent)
{
IRepository<Parent> _parent;
var item = new Parent();
item.Id = parent.Id;
item.Children = parent.Children.AddAll(parent.Children.Select(Save(parent.ChildType)); // save each child and add it to the parent's child collection
return _parent.Save(item);
}
Save(Child child)
{
IRepository<Child> _child;
var item = new Child();
item.Id = child.Id;
return _child.Save(item);
}
これを達成するための最良の解決策は何ですか?助けてくれてありがとう。
編集
複雑なオブジェクトを ViewModel に変換するにはどうすればよいでしょうか。たとえば、Child 型の子を含む Parent オブジェクトです。
ParentTypeController には次のものがあります。
ParentViewModel ToViewModel(Parent parent)
{
var model = new ParentViewModel();
model.Id = parent.Id;
model.Children = parent.Children.Select(ToViewModel); //Use the ToViewModel method in the ChildTypeController
return model;
}
ChildTypeController:
ChildViewModel ToViewModel(Child child)
{
var model = new ChildViewModel();
model.Id = child.Id;
return model;
}