-1

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;
}
4

2 に答える 2

0

正しい抽象化を定義するのに問題があると思います。この種の動作や相互作用にコントローラーを使用しないでください。あなたはすでにリポジトリを持っているので、それが手間のかかる作業をさせてください。

本当に正当な理由がない限り、アクションからアクションを呼び出すべきではありません。httpリクエストは、(機能的な)アクションにマップされます。アクションはモデル(Mvc)を使用し、戻り値を使用して応答を作成できます。

コントローラでこの親/子階層が必要な理由がわからない。多分あなたはそれが必要な理由を説明することができます。

EditTryAutoMapper 「 .NETの規則ベースのオブジェクト-オブジェクトマッパー」を編集します。オブジェクトグラフを他のオブジェクトグラフに変換します。単純な変換と複雑な変換に最適です。

于 2012-07-09T13:12:31.837 に答える
0

まず第一に、あなたのやり方を一般的なパターンとして使用するべきではありません。MSDNRedirectToAction()から:

HTTP 302 応答をブラウザーに返します。これにより、ブラウザーは指定されたアクションに対して GET 要求を行います。

したがって、ユーザーがアプリケーションに対して行うすべてのリクエストに対して、実際には2 つのリクエストを作成する必要があります。オーバーロードされたメソッドを使用したい場合は、コントローラー内で行うことができます。ブラウザのリダイレクトを引き起こす必要はありません。

そのパターンから解放されれば、あとは自然に出てくると思います。私自身のプロジェクトでは、(1) 作成または更新し、(2) データベースから「新しい」オブジェクト状態を再度要求するという 2 つのステップでデータベース アクションを実行するのが最善であることが多いことがわかりました。

于 2012-07-09T12:59:58.260 に答える