3

これがこれを説明する最良の方法であることを願っています...

学校、コース、クラスの 3 つのビュー オブジェクトがあります。各学校には複数のコースがあり、各コースには複数のクラスがあります (コースを学習プログラムと考えてください。クラスは実際のクラスです)。私のメイン ビューでは、すべての学校を表示し、1 つをクリックしてそこに移動します。その「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;
            }

最後に、私の質問は次のとおりです。モデルからビューに学校、コース、およびクラスのリストを表示するにはどうすればよいですか?

My View には次のようなものがあります。これには、私が見ている学校とその学校のコースのリストが表示されます。

<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 -> ビジネス -> コントローラーから渡されます。

スクールコントローラー:

    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>
    <% }

Course クラスには ClassNumber プロパティがありませんModel.Courses.Classes。また、すべてのコースのクラスにアクセスできるように、最初のループ内のどこかに配置する必要があります。
また、単語classはC#のキーワードであるため、問題を引き起こす可能性があります

于 2013-09-04T00:06:43.787 に答える