【问题标题】:.net mvc 3 foreach in foreach.net mvc 3 foreach 在 foreach
【发布时间】:2011-06-21 02:47:29
【问题描述】:

好的。我有3节课。类别、子类别和子子类别。

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

我认为:

  <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 个级别?

【问题讨论】:

  • 你的观点很好。您需要确保集合不为空。请出示您的控制器。
  • 感谢@Andrew Whitaker 修复语法
  • 我的控制器只包含: public ViewResult Index() { var model = db.Category.ToList();返回视图(模型); } 因为我不确定如何添加我的两个“可连接”表”
  • 私人 HelpMeContext db = new HelpMeContext();
  • 我想这个问题确实是我需要知道如何填充每个类别中包含的子类别列表。

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


【解决方案1】:

我不熟悉 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
        }
    }
}

【讨论】:

  • 你的想法不错,但是 EF 中的 Linq-to-sql 代码搞砸了。 DataLoadOptions 的对应函数应该是 .Include() .. 但由于某种原因它似乎不起作用。
  • 仅供参考,我得到的疯狂错误消息是:传递到字典中的模型项的类型为'System.Collections.Generic.List1[&lt;&gt;f__AnonymousType22[helpme.mvc.Models.Category,System .Collections.Generic.IEnumerable1[&lt;&gt;f__AnonymousType12[helpme.mvc.Models.SubCategory,System.Collections.Generic.ICollection1[helpme.mvc.Models.SubSubCategory]]]]]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable1[helpme.mvc.Models.Category]'。
  • @Niels:啊,是的,对于第二种情况,您可能无法使用强类型模型,因为它涉及自定义匿名类型。
  • @Niels:关于“由于某种原因似乎不起作用”,您的意思是它仍然会产生空集合,还是会产生某种异常?
  • model.SubCategories 当我在控制器中插入断点时填充,但是当我到达视图时似乎已经丢失了它?它只显示我的类别级别而不是子类别级别,即使我对它们都进行了 foreach。
【解决方案2】:

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

要为多个实体打开预加载,请尝试使用.Include() 传递查询路径:

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

或者如果你正在使用 DbContext:

   db.Category.Include(s=>SubCategory.Select(ss=>ss.SubCategory).ToList();

.Include 的 MSDN 文档说:

路径是包罗万象的。例如,如果包含调用指示 Include("Orders.OrderLines"),不仅会包含OrderLines, 还有订单

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2013-04-05
    • 2012-06-30
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多