2

このクラスから継承する他の3つのクラスを持つ抽象クラスがあります:-

public abstract class AbstractTask
{
  [Key]
  public int ID {get; set;}
  [DisplayName("Featured Task")]
  public bool Featured { get; set; }
  // various other properties
}

public class HighLevelTask : AbstractTask
{
  [DisplayName("Workstream Description")]
  public String Workstream { get; set; }
  public virtual ICollection<MidLevelTask> MidLevelTasks { get; set; }
}

public class MediumLevelTask : AbstractTask
{
  public int HighLevelTaskID { get; set; }
  public virtual ICollection<DetailLevelTask> DetailLevelTasks { get; set; }
}

public class DetailLevelTask : AbstractTask
{
 public int MidLevelTaskID { get; set; }
}

したがって、高レベルのタスクには任意の数の中間レベルのタスクを含めることができ、中レベルのタスクには任意の数の詳細タスクを含めることができます。抽象クラスから継承されたプロパティによって、任意のレベルのタスクを「注目」として設定できます。

HTMLビューで、「注目の」タスクのネストされたリストを表示したいと思います。だから私はコントローラーアクションでこのようなものを考えてすべての注目のタスクを収集しますが、これを提示するための最良の方法については精神的なブロックにあります。

  var qryHighLevelTasks = from t in context.HighLevelTasks
                          where t.Featured == true
                          select t;
  var rsHighLevelTasks = qryHighLevelTasks.ToList();

  foreach(var highLevelTask in rsHighLevelTasks)
  {
     // get all mid level featured tasks related to this high level task
     var qryMidTasks = from midLevelTasks in context.MidLevelTasks
                       where midLevelTasks.Featured == true
                       && midLevelTasks.HighLevelTaskID == highLevelTask.ID
                       select midLevelTasks;
     var rsMidLevelTasks = qryMidTasks.ToList();

     foreach (var midLevelTask in rsMidLevelTasks)
     {
        // get all detail level featured tasks related to this mid level task
        var qryDetailTasks = from detailLevelTasks in context.DetailLevelTasks
                             where detailLevelTasks.Featured == true
                             && detailLevelTasks.MidLevelTaskID == midLevelTask.ID
                             select detailLevelTasks;
        var rsDetailLevelTasks = qryDetailTasks.ToList();                    
        }                
   }            

おそらく、注目のタスクを表す複合モデルが必要ですか?それとももっと良い方法はありますか?何かお勧めはありますか?

4

2 に答える 2

2

「注目のタスク」のネストされたリストをレンダリングするには、「部分ビュー」をお勧めします。

さらに、最初にビューモデルに焦点を合わせてみてください。ビューモデルに「注目のタスク」のコレクションがあり、これらのコレクションを部分ビューに渡してレンダリングすることができます。ここに役立つかもしれないいくつかのリンクがあります:

1)部分ビューと強く型付けされたカスタムViewModel

2)方法:ASP.NET MVCパーシャルビューでデータを操作しますか?

于 2012-06-13T12:05:19.690 に答える
1

LINQプロジェクションを使用して、ネストされたアイテムを取得できます。

var featuredItems = from hl in context.HighLevelTasks where hl.Featured == true
                    select new
{
   MidLevelTasks = from md in context.MidLevelTask where md.MidLevelTaskID = h1.TaskID,
   DetailLevelTasks = from ll in context.DetailLevelTask where ll.LowLevelTaskID = md.MidLevelTaskID
};

エディタテンプレートを使用して、ネストされたビューをレンダリングすることもできます。

メインビュー:

foreach(item in Model.HighLevelTasks)
{
   @Html.EditorFor(item);  
}

HighLevelTask​​ビュー:

<!-- HTML here to render the parent record -->
foreach(item in Model.MidLevelTasks)
{
  @Html.EditorFor(item)
}

..同様のパターンで、中間レベルおよび詳細レベルのタスク用のエディターテンプレートを作成します。

于 2012-06-13T15:08:03.613 に答える