1

我一直在关注位于此处的 Microsoft Contoso MVC3 大学教程

我有一个关于一个领域的问题,在第 6 部分;本教程解释了如何使用复选框创建可以分配给讲师的课程表。特别是从标题“将课程作业添加到讲师编辑页面”开始

似乎过于复杂,有没有更有效的做事方式?插件/内置系统等。如果您想扩展系统以使讲师拥有的不仅仅是分配给他的课程怎么办?代码的重复将是巨大的。

教练控制器

    // GET: /Instructor/Edit/5
    public ActionResult Edit(int id)
    {
        Instructor instructor = db.Instructors
            .Include(i => i.OfficeAssignment)
            .Include(i => i.Courses)
            .Where(i => i.InstructorID == id)
            .Single();
        PopulateAssignedCourseData(instructor);
        return View(instructor);

    }

    private void UpdateInstructorCourses(string[] selectedCourses, Instructor instructorToUpdate)
    {
        if (selectedCourses == null)
        {
            instructorToUpdate.Courses = new List<Course>();
            return;
        }

        var selectedCoursesHS = new HashSet<string>(selectedCourses);
        var instructorCourses = new HashSet<int>
            (instructorToUpdate.Courses.Select(c => c.CourseID));
        foreach (var course in db.Courses)
        {
            if (selectedCoursesHS.Contains(course.CourseID.ToString()))
            {
                if (!instructorCourses.Contains(course.CourseID))
                {
                    instructorToUpdate.Courses.Add(course);
                }
            }
            else
            {
                if (instructorCourses.Contains(course.CourseID))
                {
                    instructorToUpdate.Courses.Remove(course);
                }
            }
        }
    }

    private void PopulateAssignedCourseData(Instructor instructor)
    {
        var allCourses = db.Courses;
        var instructorCourses = new HashSet<int>(instructor.Courses.Select(c => c.CourseID));
        var viewModel = new List<AssignedCourseData>();
        foreach (var course in allCourses)
        {
            viewModel.Add(new AssignedCourseData
            {
                CourseID = course.CourseID,
                Title = course.Title,
                Assigned = instructorCourses.Contains(course.CourseID)
            });
        }
        ViewBag.Courses = viewModel;
    }

编辑.cshtml

    int cnt = 0;
    List<UniversitySystem.ViewModels.AssignedCourseData> courses = ViewBag.Courses;

    foreach (var course in courses)
    {
        if (cnt++ % 3 == 0)
        {
                        @:  </tr> <tr> 
                    }
                    @: <td> 
                        <input type="checkbox" 
                               name="selectedCourses" 
                               value="@course.CourseID" 
                               @(Html.Raw(course.Assigned ? "checked=\"checked\"" : "")) /> 
                        @course.CourseID @:  @course.Title
                    @:</td>
                }
                @: </tr>
            }
    </table>
</div>
        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
}

ViewModels/AssignedCourseData.cs

    public class AssignedCourseData
    {
        public int CourseID { get; set; }
        public string Title { get; set; }
        public bool Assigned { get; set; }
    }
}

大量代码可以有效地创建这个屏幕: 屏幕

我想您可以概括 InstructorController 中使用的辅助方法,但这不是一项小任务。

处理一对多关系似乎是 CRUD 系统的基本组成部分;我很惊讶我找不到有关该主题的信息。

TLDR:有没有比上面显示的更好的方法来使用 MVC3/Entity 框架将对象关联到其他对象。

编辑 2:这是一个快速 Lightswitch 应用程序的图像 在此处输入图像描述 候选人可以拥有许多与其相关的技能、残疾和罪行。如果我要实现这个系统的 MVC 版本,我会 x3 上面列出的代码来创建相同的效果。

当然有更有效的解决方案。

4

1 回答 1

1

根据您的评论,您似乎正在寻找 MVC 作为 Lightswitch。如果是这样的话,微软就不会开发 Lightswitch。

Microsoft 提供了许多技术,MVC、Web Pages (WebMatrix)、WebForms、LightSwitch。每个都有自己独特的优势和劣势,您可以选择最适合您要求的技术。

如果您使用 MVC 进行开发,则需要花费更多的精力来编写演示代码。但是,这种额外的努力使您在演示文稿的工作方式、外观和行为方式方面具有出色的灵活性。如果您不想这样做,那么我建议您选择其他技术。

于 2012-04-14T16:42:56.903 回答