ASP.NET MVC 如何从嵌套对象的视图模型集合中动态创建表结构

Posted

技术标签:

【中文标题】ASP.NET MVC 如何从嵌套对象的视图模型集合中动态创建表结构【英文标题】:ASP.NET MVC How to create table structure dynamically in view from viewmodel collection of nested objects 【发布时间】:2019-11-28 00:33:15 【问题描述】:

我正在尝试显示一组用户选择的学期的所有课程,并在循环时动态保持格式,就像在预期的屏幕截图中一样(因此该学期仅针对属于它的相应课程和课程名称显示一次(CourseA)对于属于该课程的各个部分仅显示一次):

预期(仅适用于当前选择的 1 个学期,对于更多选择的学期,应保持相同的显示模式)

实际结果

我有一个列表,它是存储数据的 Model.SemesterSchedule。这是我尝试过的,但它不起作用,使用多个 foreach 循环时布局被破坏,而且我不确定三重 foreach 是否是一个好主意,请建议更好的替代方法:

我有以下结构:

class SemesterSchedule

   public int SemesterID get;set;
   public int SemesterName get;set;
   public int TotalClassSections get;set;
   public List<Course> Courses get;set;


class Course

   public string CourseTitle get;set
   public int ClassID get;set;
   public List<ClassSection> Sections get;set


class ClassSection
  
   public string SectionType get;set;   // Lecture or Lab etc
   public int ClassID get;set;
   public string InstructorFirstName get;set;
   --------------------------------------
   public bool Monday get;set;
   public TimeSpan MondayStart get;set;
   public TimeSpan MondayEnd get;set;
   ------------------------------------------



@if (Model.SemestersSchedule != null && Model.SemestersSchedule.Count() > 0)

  <table id="CourseScheduleTable">
     <thead>
          <tr>
             <th>Term</th>
             <th>Course</th>
             <th>Section</th>
             <th>Class#</th>
             <th>Instructor Name</th>
             <th>MON</th>
             <th>TUE</th>
             <th>WED</th>
             <th>THU</th>
             <th>FRI</th>
             <th>SAT</th>
          </tr>
     </thead>
      <tbody>                                                 
      @
        foreach (SemesterSchedule sc in Model.SemestersSchedule)
        
             <tr>
               <td rowspan="@sc.TotalSections">@sc.SemesterName</td>
             </tr>

          foreach (Course c in sc.Courses)
          
           <tr>
             <td rowspan="@c.Sections.Count()">@c.Course.CourseRunTitle</td>
           </tr>

               foreach (ClassSection s in c.Sections)
               
                 <tr>                                                   
                    <td>@s.SectionType</td>
                    <td>@s.Clas-s-room</td>
                    <td>@c.Course.FirstName @c.Course.MiddleName @c.Course.LastName</td>                                                                 

                    <td>@(s.Monday ? new DateTime(s.MondayStart.Ticks).ToString("HH:mm tt") + "-" + new DateTime(s.MondayEnd.Ticks).ToString("HH:mm tt") : "---")</td>

                    <td>@(s.Tuesday ? new DateTime(s.TuesdayStart.Ticks).ToString("HH:mm tt") + "-" + new DateTime(s.TuesdayEnd.Ticks).ToString("HH:mm tt") : "---")</td>

                    <td>@(s.Wednesday ? new DateTime(s.WednesdayStart.Ticks).ToString("HH:mm tt") + "-" + new DateTime(s.WednesdayEnd.Ticks).ToString("HH:mm tt") : "---")</td>

                    <td>@(s.Thursday ? new DateTime(s.ThursdayStart.Ticks).ToString("HH:mm tt") + "-" + new DateTime(s.ThursdayEnd.Ticks).ToString("HH:mm tt") : "---")</td>

                    <td>@(s.Friday ? new DateTime(s.FridayStart.Ticks).ToString("HH:mm tt") + "-" + new DateTime(s.FridayEnd.Ticks).ToString("HH:mm tt") : "---")</td>

                    <td>@(s.Saturday ? new DateTime(s.SaturdayStart.Ticks).ToString("HH:mm tt") + "-" + new DateTime(s.SaturdayEnd.Ticks).ToString("HH:mm tt") : "---")</td>
               </tr>
             
          
       
   
</tbody>

【问题讨论】:

请扩展“布局已损坏”。具体发生了什么,您具体期待什么 @GregH 完成,我添加了要求的照片,说明实际发生的情况并澄清了预期的图像。 【参考方案1】:

当您使用带有rowspan="n" 属性的&lt;td&gt; 时,您不能在接下来的n 行中使用另一个&lt;td&gt;

正确的 html 应该是:

<table class="blueTable">
    <thead>
        <tr>
            <th>Term</th>
            <th>Course</th>
            <th>Section</th>
            <th>Class</th>
            <th>Instructor</th>
            <th>MON</th>
            <th>TUE</th>
            <th>WED</th>
            <th>THU</th>
            <th>FRI</th>
            <th>SAT</th>
        </tr>
    </thead>
    <tbody>
        <tr> <!-- 11 columns -->
            <td rowspan="4">2019 Term Spring</td>
            <td rowspan="2">CourseA</td>
            <td>Lecture</td>
            <td>219</td>
            <td>John Doe</td>
            <td>---</td>
            <td>09:00</td>
            <td>---</td>
            <td>09:00</td>
            <td>---</td>
            <td>---</td>
        </tr>
        <tr> <!-- 9 columns -->
            <td>Lab</td>
            <td>2019</td>
            <td>John Doe</td>
            <td>---</td>
            <td>11:00</td>
            <td>---</td>
            <td>---</td>
            <td>---</td>
            <td>---</td>
        </tr>
        <tr> <!-- 10 columns -->
            <td>CourseB</td>
            <td>Lecture</td>
            <td>212</td>
            <td>Jennifer Doe</td>
            <td>09:00</td>
            <td>---</td>
            <td>11:00</td>
            <td>---</td>
            <td>---</td>
            <td>---</td>
        </tr>
        <tr> <!-- 10 columns -->
            <td>CourseC</td>
            <td>Lecture</td>
            <td>102</td>
            <td>Jim B</td>
            <td>---</td>
            <td>---</td>
            <td>---</td>
            <td>---</td>
            <td>---</td>
            <td>13:00</td>
        </tr>
    </tbody>
</table>

正如在Fiddle 中看到的那样。

【讨论】:

谢谢,只是在使用 foreach 时我无法保持该格式,那么如何将该模式与 foreach 合并并保持所需的显示格式? 也许这会有所帮助:Generated table with rowspan causing extra cells

以上是关于ASP.NET MVC 如何从嵌套对象的视图模型集合中动态创建表结构的主要内容,如果未能解决你的问题,请参考以下文章

如何继承 ASP.NET MVC 控制器并仅更改视图?

通过 ASP.NET MVC 在 C# 视图中遍历匿名对象的嵌套 LINQ 查询

ASP .NET MVC 3 - 将参数从视图传递到控制器

是否可以将多个模型对象发送到 ASP.NET MVC 视图?

Asp.Net MVC 从模型创建视图脚手架不生成 int 属性

在 ASP.Net MVC (LINQ) 中将嵌套数据从控制器传递到视图