.net mvc 3 foreach in foreach

时间:2011-06-21 02:47:29

标签: asp.net-mvc asp.net-mvc-3 razor

行。我有3节课。 Category,SubCategory和SubSubcategory。

我想(使用剃刀)显示它们。但是,我的语法不太可能:

我想:

  <ul>
  @foreach (var item in Model) {
    <li>
            @Html.DisplayFor(modelItem => item.Name)
            @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
            @Html.ActionLink("Details", "Details", new { id=item.ID }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.ID })

            <ul>
            @foreach (var sc in item.SubCategories)
            {
                @Html.Display(sc.Name)

                foreach (var ssc in sc.SubSubCategories)
                 {
                     @Html.Display(ssc.Name)
                 }
            }
            </ul>
    </li>
  }
  </ul>

但是它没有填充SubCategory和SubSubCategory。我试过从控制器端给它:db.Category.ToList(); (但这只给了我第一级.. SubCategory和SubSubCategory被忽略。

我尝试使用db.Category.Include(“SubCategory”)。ToList();但它不喜欢这个。我如何填充这3个级别?

2 个答案:

答案 0 :(得分:0)

我不熟悉EF,但我知道在LINQ-to-SQL中,您可以使用DataLoadOptions来包含其他连接数据:

HelpMeContext db = new HelpMeContext();

DataLoadOptions options = new DataLoadOptions();
options.LoadWith<Category>(c => c.SubCategories);
options.LoadWith<SubCategory>(sc => sc.SubSubCategories);
db.LoadOptions = options;

// now this should load subcategories and sub-subcategories with it.
var model = db.Category.ToList();

您也可以尝试将所有数据选择为匿名类型,但阅读和使用它也有点麻烦:

var model = db.Category
    .Select(c =>
        new { Category = c, SubCategories = c.SubCategories.Select(sc =>
            new { SubCategory = sc, SubSubCategories = sc.SubSubCategories }
        )}
    ).ToList();

你可以说:

@foreach (var item in Model) {
    //item.Category.Name
    @foreach (var sc in item.SubCategories) {
        //sc.SubCategory.Name
        @foreach (var ssc in sc.SubSubCategories) [
            /ssc.Name
        }
    }
}

答案 1 :(得分:0)

对视图执行查询是不对的。更好的选择是形成ViewModel,而不是将其传递给视图。

为了打开多个实体的急切加载,尝试使用.Include()传递查询路径:

db.Category.Include("SubCategory.SubSubCategory").ToList();

或者如果您正在使用DbContext:

   db.Category.Include(s=>SubCategory.Select(ss=>ss.SubCategory).ToList();
<。> .Include的MSDN文档说:

  

路径包罗万象。例如,如果包含呼叫指示   包含(“Orders.OrderLines”),不仅包括OrderLines,   还有订单