3

我希望这是解释这一点的最佳方式......

我有 3 个视图对象:学校、课程和班级。每所学校都有多门课程,每门课程可以有多个课程(将课程视为学习计划,课程是实际课程)。在我的主视图中,我显示了所有学校,然后单击一个转到它。在那个“CourseView”页面上,它显示了学校的名称以及与该学校相关的所有课程。我想要做的,也是列出与每门课程相关的所有课程。这可能吗(没有大量的 jQuery/JSON 魔法,我还在学习)?

public class School
{
    public int Id { get; set; }
    public string SchoolName { get; set; }
    public string WelcomeMsg { get; set; }
    public string SchoolLogo { get; set; }
    public List<Course> Courses { get; set; }
}

public class Course
{
    public int Id { get; set; }
    public string CourseCode { get; set; }
    public string CourseName { get; set; }
    public int SchoolId { get; set; }
    public List<Class> Classes { get; set; }
}

public class Class
{
    public int Id { get; set; }
    public string ClassNumer { get; set; }
    public int CourseId { get; set; }
    public int InstructorId { get; set; }
}

在我的 SchoolDAO.cs 中,我有以下内容:

                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@SchoolId", SchoolId);
                    using (SqlDataReader dr = cmd.ExecuteReader())
                    {
                        if (dr.Read())
                        {
                            // fill school object in another method.
                            school = readRecord(dr);
                        }
                    }

                    // Get all courses available for this school.
                    school.Courses = CoursesDAO.GetCourses(SchoolId);

                    return school;
                }

它还调用 CourseDAO.cs 中的一个方法来获取该学校可用的课程:

            {
                SqlCommand cmd = new SqlCommand("Courses.GetCourses", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@SchoolId", SchoolId);
                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                    {
                        courses.Add(readRecord(dr));
                    }
                }

                // Get all classes available for each course.
                foreach (var course in courses)
                {
                    course.Classes = ClassDAO.GetClasses(course.Id);
                }

                return courses;
            }

然后调用 ClassDAO 方法来获取每门课程的所有课程:

            {
                SqlCommand cmd = new SqlCommand("Courses.GetCourses", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@SchoolId", courseId);
                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                    {
                        classes.Add(readRecord(dr));
                    }
                }

                return classes;
            }

所以最后,我的问题是:如何从模型中在视图中显示学校、课程和班级的列表?

我的视图有以下内容,其中显示了我正在查看的学校,以及该学校的课程列表:

<div class="display-field">
    <h1><%: Model.SchoolName %></h1>
    <h3><%: Model.WelcomeTitle %></h3>
    <blockquote> <i><%: Model.WelcomeText %></i></blockquote> 
</div>

<!-- Courses -->
<div class="display-field">
    <table id="courses">             
            <thead>
                <th>Course Code</th>
                <th>Course Name</th>
            </thead>
        <tbody>
        <%
            foreach (var item in Model.Courses) {
        %>
            <tr>
                <td><%: Html.DisplayFor(model => item.CourseCode) %></td>
                <td><%: Html.DisplayFor(model => item.CourseName) %></td>
            </tr>
        <% } %></tbody>
    </table>
</div>

在那张桌子之后,我想放另一个 id="classes" 的桌子,但遗憾的是,当我尝试这样做时:

        <%
            foreach (var class in Model.Courses) {
        %>
            <tr>
                <td><%: Html.DisplayFor(model => item.ClassNumber) %></td>
            </tr>
        <% } %>

它不起作用 - 我假设是因为我不知道如何访问属于列表的列表,或者因为这不是模型的工作方式。

对此的任何见解将不胜感激。谢谢!

PS - 信息通过简单的方法从DAO -> Business -> Controller 传递,例如:

学校控制器:

    public ActionResult ViewSchool(int Id)
    {
        School school = SchoolBusiness.GetSchool(Id);
        return View(school);
    }

SchoolBusiness.GetSchool:

    public static School GetSchool(int Id)
    {
        School school = SchoolDAO.GetSchool(Id);
        return school;
    }
4

4 回答 4

8

您需要在遍历每门课程并获取课程列表时引用它。为此,请嵌套foreach语句。

我将 HTML 更改为简单列表,因为我认为它更易于理解。如果这是您想要的,更改为嵌套表应该足够简单。

<!-- Courses -->
<ul>
    <% foreach (var course in Model.Courses) { %>
        <li>
            <%: Html.DisplayFor(model => course.CourseCode) %>
            <%: Html.DisplayFor(model => course.CourseName) %>
            <!-- Classes -->
            <ul>
            <% foreach (var class in course.Classes) { %>
                <li><%: Html.DisplayFor(model => class.ClassNumber) %></li>
            <% } %>
            </ul>
        </li>
    <% } %>
</ul>
于 2013-09-04T00:14:00.747 回答
3

首先不要使用类作为变量,它是一个保留字,但它不是这样的:

<%
foreach (var course in Model.Courses) {
    foreach (var courseClass in course.Classes) {
    %>
        <tr>
            <td><%: Html.DisplayFor(model => courseClass.ClassNumber) %></td>
        </tr>
    <% 
    } 
}
%>
于 2013-09-04T00:20:54.123 回答
1

这部分看起来不正确:

        foreach (var class in Model.Courses) {
    %>
        <tr>
            <td><%: Html.DisplayFor(model => item.ClassNumber) %></td>
        </tr>
    <% }

您的课程课程没有 ClassNumber 属性。您应该说Model.Courses.Classes,并将其放在您的第一个循环中某处,以便您可以访问每门课程的课程。
wordclass也可能会导致问题,因为它是 c# 中的关键字

于 2013-09-04T00:06:43.787 回答
1
    <%
        foreach (var item in Model.Courses) {
    %>
        <tr>
            <td><%: Html.DisplayFor(model => item.CourseCode) %></td>
            <td><%: Html.DisplayFor(model => item.CourseName) %></td>
        </tr>
        <tr>
          <td>Classes</td>
          <td>
            <% foreach (var class in item.Classes) { %>

                -- list your classes here

            <% } %>
         </td>
      </tr>
    <% } %></tbody>
于 2013-09-04T00:09:00.487 回答