Contoso mvc3系统,多对多关系

时间:2012-04-14 15:32:25

标签: c# .net asp.net-mvc-3 entity-framework

我一直在关注位于here

的Microsoft Contoso MVC3大学教程

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

看起来过于复杂,是否有更有效的做事方式?插件/内置系统等 如果您想扩展系统,以便教师不仅仅有分配给他的课程,该怎么办?代码的重复将是巨大的。

InstructorController

    // 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;
    }

edit.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; }
    }
}

有效创建此屏幕的大量代码: Screen

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

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

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

EDIT2: 这是一个快速Lightswitch应用程序的图像 enter image description here 候选人可以拥有与他们相关的许多技能,残疾和违法行为。如果我要实现这个系统的MVC版本,我将使用上面列出的x3代码来创建相同的效果。

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

1 个答案:

答案 0 :(得分:1)

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

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

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