내가 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"를 사용하고 있지만이 개체를 내 엔터티의 페이지를 만드는 데 사용하도록 조정할 수 있기를 바랍니다.