首页 > 解决方案 > 检索主要类别下的子类别列表并将其传递给视图

问题描述

大家晚上好。首先我在做一个电子学习项目。到问题。

我有一个CourseIEnumerable<Modules>和一个ModuleIEnumerable<Topics>。当前,当用户单击视图上的任何课程时,它会打开一个CourseDetail视图。此视图旨在向用户显示详细信息。Course像所有模块一样,当单击模块时,我希望下拉每个模块下的所有主题。

这是我发现它真的很困难的地方。我可以检索Modules课程的所有内容,但我发现很难ToList()为每个模块提供所有主题。因此,当用户单击模块时,它会打开一个列出所有主题的内部 div。

[AllowAnonymous]
        public async Task<IActionResult> CourseDetail(int id)
        {
            var course = _context.Courses.FirstOrDefault(c => c.CourseId == id);
            var courseId = course.CourseId;

            var video = _context.Topic.Include(m => m.Modules).Where(m => m.Modules.CourseId == courseId).Sum(m => m.Duration);


            float totalSeconds = video;
            TimeSpan time = TimeSpan.FromSeconds(totalSeconds);
            var duration = time.ToString("hh':'mm':'ss"); // 00:03:48
            var moduleCount = _context.Modules.Where(c => c.CourseId == courseId).Count();


           var courseModules = await _context.Modules.Where(c => c.CourseId == courseId).ToListAsync();
            foreach (var module in courseModules)
            {
                var moduleId = module.ModuleId;
                var moduleTopics = _context.Topic.Where(c => c.ModuleId == moduleId).ToList();
                ViewBag.moduleTopics = moduleTopics;
            }





            return View(course);
        }

这就是我所做的。我的观点看起来像这样

 <div id="accordion_lessons" role="tablist" class="add_bottom_45">
                        @foreach (var module in ViewBag.Modules)
                        {
                            <div class="card">
                                <div class="card-header" role="tab" id="headingOne_@module.ModuleId">
                                    <h5 class="mb-0">
                                        <a data-toggle="collapse" href="#collapseOne_@module.ModuleId" aria-expanded="true" aria-controls="collapseOne"><i class="indicator ti-minus"></i>@Html.Raw(module.Title)</a>
                                    </h5>
                                </div>

                                <div id="collapseOne_@module.ModuleId" class="collapse show" role="tabpanel" aria-labelledby="headingOne" data-parent="#accordion_lessons">
                                    <div class="card-body">
                                        <div class="list_lessons">
                                            <ul>
                                                @foreach (var topic in ViewBag.moduleTopics)
                                                {
                                                    <li><a href="#" class="video">@topic.Title</a><span>@topic.Duration</span></li>
                                                }

                                            </ul>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        }


                    </div>

我意识到Viewbag.ModuleTopics唯一保存最后一个项目的主题列表,即Module我通过foreach语句循环遍历的主题列表,我怎么可能实现列出课程模块,点击任何模块时,它会显示一个列出主题的内部 div。谢谢

标签: c#asp.net.netasp.net-mvcasp.net-core-2.0

解决方案


您可以在 ViewBag 中存储所有主题的列表,并在视图中使用它来显示每门课程的主题。

[AllowAnonymous]
        public async Task<IActionResult> CourseDetail(int id)
        {
            var course = _context.Courses.FirstOrDefault(c => c.CourseId == id);
            var courseId = course.CourseId;

            var video = _context.Topic.Include(m => m.Modules).Where(m => m.Modules.CourseId == courseId).Sum(m => m.Duration);


            float totalSeconds = video;
            TimeSpan time = TimeSpan.FromSeconds(totalSeconds);
            var duration = time.ToString("hh':'mm':'ss"); // 00:03:48
            var moduleCount = _context.Modules.Where(c => c.CourseId == courseId).Count();


           ViewBag.Topics= _context.Topic.ToList();

           return View(course);
        }

并且在视图中..

<div id="accordion_lessons" role="tablist" class="add_bottom_45">
@foreach(var module in ViewBag.Modules)
    {
        <div class="card">
            <div class="card-header" role="tab" id="headingOne_@module.ModuleId">
                <h5 class="mb-0">
                    <a data-toggle="collapse" href="#collapseOne_@module.ModuleId" aria-expanded="true" aria-controls="collapseOne"><i class="indicator ti-minus"></i>@Html.Raw(module.Title)</a>
                </h5>
            </div>

            <div id="collapseOne_@module.ModuleId" class="collapse show" role="tabpanel" aria-labelledby="headingOne" data-parent="#accordion_lessons">
                <div class="card-body">
                    <div class="list_lessons">
                        <ul>
                            @var topicsForCurrentModule = ViewBag.Topics.Where(c => c.ModuleId == module.ModuleId)
                            @foreach (var topic in topicsForCurrentModule)
                                                {
                                <li><a href="#" class="video">@topic.Title</a><span>@topic.Duration</span></li>
                            }

                        </ul>
                    </div>
                </div>
            </div>
        </div>
    }

推荐阅读