2013-04-08 156 views
2

我读补习从http://www.asp.net/“为ASP.NET MVC应用程序创建一个实体框架数据模型”,并希望使用多个复选框列表,从第6部分 - http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/updating-related-data-with-the-entity-framework-in-an-asp-net-mvc-applicationASP.NET MVC 3 - 多个复选框列表

在这教程中,只能从教师的编辑页面访问这些复选框选项(为每个指导教师分配课程)。我想在创建页面上呈现这些复选框,但无法调整我在本教程中找到的代码。

这些是用于显示和使用数据库新输入的复选框的代码部分。

HTTPGET编辑方法

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

HttpPost Edit方法

[HttpPost] 
public ActionResult Edit(int id, FormCollection formCollection, string[] selectedCourses) 
{ 
    var instructorToUpdate = db.Instructors 
     .Include(i => i.OfficeAssignment) 
     .Include(i => i.Courses) 
     .Where(i => i.InstructorID == id) 
     .Single(); 
    if (TryUpdateModel(instructorToUpdate, "", null, new string[] { "Courses" })) 
    { 
     try 
     { 
      if (String.IsNullOrWhiteSpace(instructorToUpdate.OfficeAssignment.Location)) 
      { 
       instructorToUpdate.OfficeAssignment = null; 
      } 

      UpdateInstructorCourses(selectedCourses, instructorToUpdate); 

      db.Entry(instructorToUpdate).State = EntityState.Modified; 
      db.SaveChanges(); 

      return RedirectToAction("Index"); 
     } 
     catch (DataException) 
     { 
      //Log the error (add a variable name after DataException) 
      ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator."); 
     } 
    } 
    PopulateAssignedCourseData(instructorToUpdate); 
    return View(instructorToUpdate); 
} 

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

和视图

<div class="editor-field"> 
    <table> 
     <tr> 
      @{ 
       int cnt = 0; 
       List<ContosoUniversity.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> 

所以,我想插入多个选择(选择选项)到数据库中,但想要在创建页面上立即显示这个复选框列表,而不是像它那样的编辑页面如教程中所做的那样。如果你有另一个与本教程无关的解决方案,我也会很感激。我知道我不能使用这些方法,因为它们是Edit的方法,所以它们以“ID”作为参数,但我希望可以调整它们以用于实体的创建页面。

回答