私のアクションコントローラのコードは、素人に見えます
-
23-08-2019 - |
質問
最初の投稿時間、
私はMVCのABITで遊んでてきた...私は、これらのフィールドの一部がポストに空白にすることができ、複数の入力フィールドを持つビューを持っています。
ポストのためのコントローラ内部のアクションメソッドは、次のようになります。
public ActionResult Filter(int? id, string firstName, string lastName, bool? isMember)
私は自分のデータベース上での動的LINQののquerysを実行するために周り蹴りされたDynamicQuery拡張子を使用してきたと私はexecusionのためのデータアクセス層に渡される検索オブジェクトでこれをカプセル化してきました。
しかし、私はまた、入力値とクエリの結果を表示するためのビューに戻されるカスタマイズのViewDataオブジェクトを持っている。
私は、検索オブジェクトのプロパティとViewDatasの両方を設定することだとしてこれは、すべてのコードに少し厄介に見えます。
public ActionResult Filter(int? id, string firstName, string lastName, bool? isMember) {
var search = new Search {
Id = id,
FirstName = firstName,
LastName = lastName,
Member = isMember
};
var memberViewData = new MemberViewData {
Id = id,
FirstName = firstName,
LastName = lastName,
Member = isMember
};
memberViewData.Results = _dataRepository.GetMember(search);
return View("Search", memberViewData);
}
私は終わっこれを考えていますし、実際にはデータアクセス層に値を渡すと、コントローラでのViewDataを移入、または私は使用することができますはるかにエレガントなパターンや習慣があるでしょうか?
申し訳ありませんが、これはフレームワークに掘るためのアイデアをバウンスする人々と時間を割り当てる、ないダンプと思われる場合。
解決
は、スニペットのMemberViewDataクラスによると、検索クラスのプロパティに加えて、結果の性質を持っています。だから、最初のステップは、MemberViewDataは検索から派生作成し、パラメータとして検索インスタンスを受け入れ、それから、基本的なプロパティを割り当てますコンストラクタを定義することです。次の私はそうのようなアクションメソッドを変更します。
public ActionResult Filter(Search search)
{
return View("Search", new MemberViewData(search)
{
Results = _dataRepository.GetMember(search)
});
}
他のヒント
データをバインドするために使用しますmodelbinder
、ModelBinderはフェッチするだけの結果を残している、あなたのためのMemberViewDataを構築することができます。
また、このビューのデータオブジェクトを構築し、単にそれに委譲する方法を理解し、プレゼンテーションサービスを作成することに決めることができました。でも、私はこちらのモデルバインダーのアプローチを好むます。