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)部分视图和强类型自定义视图模型

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

高级任务视图:

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

..以类似的模式,为中间和详细级别任务创建编辑器模板。

于 2012-06-13T15:08:03.613 回答