.net mvc 3 foreach в foreach - PullRequest
0 голосов
/ 21 июня 2011

OK. У меня есть 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 уровня этого?

Ответы [ 2 ]

0 голосов
/ 13 июля 2013

Выполнение запросов по представлениям не верно. Лучше было бы сформировать вашу ViewModel, чем передать ее для просмотра.

Для включения активной загрузки для нескольких объектов попробуйте использовать .Include () , передавая туда путь запроса:

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

Или, если вы используете DbContext:

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

Документация MSDN .Include гласит:

Пути все включено. Например, если вызов включает Включить ("Orders.OrderLines"), не только будут включены OrderLines, но также заказы

0 голосов
/ 21 июня 2011

Я не знаком с 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
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...