2013-04-08 5 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 편집 방법

[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> 

그래서, 나는 데이터베이스에 여러 선택 (선택을 선택)을 삽입 할 전망하지만, 이 체크 박스 목록을 작성 페이지에 즉시 표시하고 편집 페이지는 표시하지 않으려합니다. 자습서 에서처럼 이 튜토리얼과 관련없는 또 다른 솔루션이 있다면 감사 할 것입니다. 편집을위한 메서드이기 때문에 이러한 메서드를 사용할 수 없다는 것을 알고 있으므로 매개 변수로 "id"를 사용하고 있지만이 개체를 내 엔터티의 페이지를 만드는 데 사용하도록 조정할 수 있기를 바랍니다.

답변