【问题标题】:MVC .Net view nested list of modelsMVC .Net 查看模型的嵌套列表
【发布时间】:2013-01-22 21:25:15
【问题描述】:

我有一个抽象类,其中有 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();                    
        }                
   }            

也许我应该有一个复合模型来表示特色任务?或者,还有更好的方法?有什么建议吗?

【问题讨论】:

  • 我会创建一个视图模型,更多代码,但更具可读性
  • 最好考虑使用“部分视图”来呈现“特色任务”的嵌套列表。此外,请尝试首先关注您的视图模型。您的视图模型中可能有一个“特色任务”集合,并将这些集合传递给要呈现的局部视图。

标签: c# asp.net-mvc model-view-controller architecture


【解决方案1】:

我建议使用“部分视图”来呈现“特色任务”的嵌套列表。

此外,请先尝试关注您的视图模型。您的视图模型中可能有一组“特色任务”,并将这些集合传递给您的局部视图以进行渲染。这里有一些可能有帮助的链接:

1) Partial Views and Strongly Typed Custom ViewModels

2)How Do I: Work with Data in ASP.NET MVC Partial Views?

【讨论】:

  • @Gordon,对我的回答有任何反馈吗?
【解决方案2】:

您可以使用 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)
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    相关资源
    最近更新 更多