我希望这是解释这个问题的最好方法......
我有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传递 - &gt;业务 - &gt;控制器通过简单的方法,如:
SchoolController:
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;
}
答案 0 :(得分: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>
答案 1 :(得分:3)
首先不要使用class作为变量,它是一个保留字,但它不是这样的:
<%
foreach (var course in Model.Courses) {
foreach (var courseClass in course.Classes) {
%>
<tr>
<td><%: Html.DisplayFor(model => courseClass.ClassNumber) %></td>
</tr>
<%
}
}
%>
答案 2 :(得分:1)
这部分看起来不对:
foreach (var class in Model.Courses) {
%>
<tr>
<td><%: Html.DisplayFor(model => item.ClassNumber) %></td>
</tr>
<% }
您的课程类没有ClassNumber属性。您应该说Model.Courses.Classes
,并将其放在您的第一个循环中,以便您可以访问每个课程的课程。
另外,单词class
可能导致问题,因为它是c#
答案 3 :(得分: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>