私の質問がばかげていることは知っていますが、私の問題の解決策がわからず、stackoverflowに関する同様の質問を理解できます。簡単なブログをやっています。そして、私がこのブログの1つの投稿に行くとき、私は彼のために投稿のテキストとコメントを見なければなりません。それらは私の日付ベースにありますが、両方を表示する方法がわかりません。私を助けてください
4 に答える
このビューまたはこのビューに必要なデータを表すViewModelを作成する必要があります。次に例を示します。
public class OrderViewModel {
public int Id { get; set; }
public DateTime DateOrder { get; set; }
public decimal Total { get; set; }
public string CustomerName { get; set; }
public List<Item> Items { get; set; }
// other properties
}
そして、サンプル用に(かみそりを使用して)、このViewModelを使用してビューを入力する必要があります。
@model Models.ViewModels.OrderViewModel
モデル内のコメントの関係によって異なります。通常、コメントは投稿の子コレクションにする必要があります。したがって、ビューでは、次のようなもの (Razor) でコメントをレンダリングできるはずです。
@foreach (var comment in Model.Comments) {
// comments display goes here
}
モデルをコントローラーからビューに渡すときは、非効率的なクエリを作成しないようにしてください。DB でモデルを取得する方法に応じて、クエリがブログでコメントを取得することを確認してください。たとえば、「Include」ディレクティブになるEFを使用している場合
.Include(p => p.Comment);
この特定のビューのカスタム ViewModel を作成できます。このようなもの:
public class BlogReaderViewModel
{
// various fields which exist on either the post or the comments
}
次に、ビューのその ViewModel にバインドします。Controller アクションは、必要なモデルを取得し、ViewModel のインスタンスを構築して View に渡します。
別のオプションは、を使用することTuple
です。これは、他の複数の型の厳密に型指定されたコンテナーとして機能するジェネリック クラスです。したがって、ビューのモデルは次のようになります。
Tuple<Post, Comments>
全体的な設計の観点から、私の最大の推奨事項は、モデルが互いにどのように関連しているかを検討し、「集約ルート」を見つけることです。コメント付きのブログ投稿の場合、投稿が集約ルートになるように思えます。モデル自体にコメントが含まれている必要があります。このようなもの:
public class BlogPost
{
public string Title { get; set; }
public string Body { get; set; }
public IEnumerable<Comment> Comments { get; set; }
}
集約ルートは親オブジェクトであり、その子オブジェクトを内部的に認識しているという考え方です。オブジェクトを使用するたびに、これらのオブジェクトの階層を手動で構成する必要はありません。
1つのオプションは、ビューのレンダリングに必要なデータの両方のグループを表す複合モデルを作成し、各サブモデルをビュー自体のエディターテンプレートに渡すことです。