Настройка данных в нескольких вложенных списках ASP.NET MVC C#

#c# #asp.net #asp.net-mvc #list #asp.net-mvc-4

#c# #asp.net #asp.net-mvc #Список #asp.net-mvc-4

Вопрос:

Я стажер с очень базовыми знаниями ASP и C #. Я пытаюсь отобразить список проектов> карты> тематические карты в приложении, над которым я работаю в ASP.NET MVC. В моем третьем foreach я получаю сообщение об ошибке: «Не содержит определения для «ThemeMaps», и не удалось найти метод расширения «ThemeMaps», принимающий первый аргумент типа».

Я не понимаю, почему vmProject.Maps не содержит свойства ThemeMaps. Я создал этот список точно так же, как карты. Что я делаю не так?

LayersController.cs

             // Create viewmodel object
            var viewModel = new AddLayerToThemeMapViewModel();

            // Create Project list
            viewModel.Projects = new List<AddProject>();

            // Loop over all maps
            List<Project> projects = this.applicationDb.Projects.OrderBy(e => e.Title).ToList();
            foreach (var project in projects)
            {
                // Create map
                var vmProject = new AddProject()
                {
                    ProjectId = project.ProjectID,
                    ProjectTitle = project.Title,
                    Maps = new List<AddLayerMap>(),
                };

                foreach (var map in project.Maps.OrderBy(e => e.Title))
                {
                    // Create map
                    vmProject.Maps.Add(new AddLayerMap()
                    {
                        MapId = map.MapId,
                        MapTitle = map.Title,
                        ThemeMaps = new List<AddLayerMapThemeMap>(),
                    });

                    // Loop over all thememaps in map
                    foreach (var thememap in map.ThemeMaps.OrderBy(e => e.Order))
                    {
                        vmProject.Maps.ThemeMaps.Add(new AddLayerMapThemeMap()
                        {
                            ThemeMapId = thememap.ThemeMapId,
                            ThemeMapTitle = thememap.Title,
                        });
                    }
                }

                // Add map to list
                viewModel.Projects.Add(vmProject);
            }
  

Мой класс viewmodel

 using Mapgear.MapViewer.Entities;
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Mapgear.MapViewer.ViewModels
{
    public class AddLayerToThemeMapViewModel
    {
        public Guid LayerId { get; set; }

        public List<AddProject> Projects { get; set; }
    }

    public class AddProject
    {
        public Guid ProjectId { get; set; }

        public string ProjectTitle { get; set; }

        public List<AddLayerMap> Maps { get; set; }
    }

    public class AddLayerMap
    {
        public Guid MapId { get; set; }

        public string MapTitle { get; set; }

        public List<AddLayerMapThemeMap> ThemeMaps { get; set; }
    }

    public class AddLayerMapThemeMap
    {
        public Guid ThemeMapId { get; set; }

        public string ThemeMapTitle { get; set; }
    }
}
  

Перед тем, как приступить к работе на бумаге, я составил таблицу, которая выглядит следующим образом:

  • layerId
  • Проект списка
    • ProjectID
    • ProjectTitle
    • Отображение списка
      • mapID
      • MapTitle
      • Список темная карта
        • ThemeMapId
        • Заголовок темы

Я знаю, что имена моих классов немного не в порядке, однако я не пишу их сам. Собираюсь оптимизировать их после.

PS: Это мой первый вопрос о StackOverflow!

Комментарии:

1. vmProject.Maps есть List<Maps> . Возможно, вам захочется вызвать FirstOrDefault() для этого, прежде чем обращаться к ThemeMaps .

Ответ №1:

Я немного изменил код во втором цикле for-each. Я добавил переменную для вновь созданной карты и добавил тематические карты к этой созданной карте. Проверьте, правильно ли это.

 var newMap = new AddLayerMap()
{
    MapId = map.MapId,
    MapTitle = map.Title,
    ThemeMaps = new List<AddLayerMapThemeMap>(),
};
// Create map
vmProject.Maps.Add(newMap);

// Loop over all thememaps in map
foreach (var thememap in map.ThemeMaps.OrderBy(e => e.Order))
{
    newMap.ThemeMaps.Add(new AddLayerMapThemeMap()
    {
        ThemeMapId = thememap.ThemeMapId,
        ThemeMapTitle = thememap.Title,
    });
}
  

Комментарии:

1. Это сработало отлично, большое вам спасибо! Что я сам не вижу этого решения. Чем это отличается от того, что я сделал? Потому что я думал, что это то же самое.