// GET: Instructors/Edit/5
        public async Task <IActionResult> Edit(int?id)
        {
            if (id == null)
            {
                return(NotFound());
            }

            InstructorCoursesViewModel instructorCoursesVM = new InstructorCoursesViewModel();

            //var instructor = await _context.Instructors.FindAsync(id);

            instructorCoursesVM.Instructor = await _context.Instructors
                                             .Include(i => i.OfficeAssignment)
                                             .Include(i => i.CourseAssignments).ThenInclude(i => i.Course)
                                             .AsNoTracking()
                                             .FirstOrDefaultAsync(m => m.ID == id);

            if (instructorCoursesVM.Instructor == null)
            {
                return(NotFound());
            }

            PopulateAssignedCourseData(instructorCoursesVM.Instructor);

            instructorCoursesVM.AssignedCourseDataList = this.AssignedCourseDataList;

            return(View(instructorCoursesVM));
        }
        public async Task <IActionResult> Edit(int?id, string[] selectedCourses,
                                               [Bind("ID,LastName,FirstMidName,HireDate")] Instructor instructor)
        {
            if (id != instructor.ID)
            {
                return(NotFound());
            }

            InstructorCoursesViewModel instructorCoursesVM = new InstructorCoursesViewModel();

            instructorCoursesVM.Instructor = await _context.Instructors
                                             .Include(i => i.OfficeAssignment)
                                             .Include(i => i.CourseAssignments)
                                             .ThenInclude(i => i.Course)
                                             .FirstOrDefaultAsync(s => s.ID == id);

            if (instructorCoursesVM.Instructor == null)
            {
                return(NotFound());
            }

            if (await TryUpdateModelAsync <Instructor>(
                    instructorCoursesVM.Instructor,
                    "Instructor",
                    i => i.FirstMidName, i => i.LastName,
                    i => i.HireDate, i => i.OfficeAssignment))
            {
                if (String.IsNullOrWhiteSpace(
                        instructorCoursesVM.Instructor.OfficeAssignment?.Location))
                {
                    instructorCoursesVM.Instructor.OfficeAssignment = null;
                }
                UpdateInstructorCourses(selectedCourses, instructorCoursesVM.Instructor);

                try
                {
                    //_context.Update(instructor);
                    await _context.SaveChangesAsync();
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!InstructorExists(instructor.ID))
                    {
                        return(NotFound());
                    }
                    else
                    {
                        throw;
                    }
                }
                return(RedirectToAction(nameof(Index)));
            }

            //These method calls restore the assigned course data entered on the page, when it is redisplayed with an error message
            UpdateInstructorCourses(selectedCourses, instructorCoursesVM.Instructor);
            PopulateAssignedCourseData(instructorCoursesVM.Instructor);
            instructorCoursesVM.AssignedCourseDataList = this.AssignedCourseDataList;

            return(View(instructorCoursesVM));
        }
        // GET: Instructors/Create
        public IActionResult Create()
        {
            InstructorCoursesViewModel instructorCoursesVM = new InstructorCoursesViewModel();

            instructorCoursesVM.Instructor = new Instructor();
            instructorCoursesVM.Instructor.CourseAssignments = new List <CourseAssignment>();

            // Provides an empty collection for the foreach loop
            // foreach (var course in Model.AssignedCourseDataList)
            // in the Create Razor page.
            PopulateAssignedCourseData(instructorCoursesVM.Instructor);
            instructorCoursesVM.AssignedCourseDataList = this.AssignedCourseDataList;

            return(View(instructorCoursesVM));
        }
        public async Task <IActionResult> Create(string[] selectedCourses,
                                                 [Bind("ID,LastName,FirstMidName,HireDate")] Instructor instructor)
        {
            InstructorCoursesViewModel instructorCoursesVM = new InstructorCoursesViewModel();

            instructorCoursesVM.Instructor = new Instructor();

            if (selectedCourses != null)
            {
                instructorCoursesVM.Instructor.CourseAssignments = new List <CourseAssignment>();
                foreach (var course in selectedCourses)
                {
                    var courseToAdd = new CourseAssignment
                    {
                        // Note that only CourseID is populated because InstructorID does not exist
                        // until new instructor is created by SaveChangesAsync() below
                        CourseID = int.Parse(course)
                    };
                    instructorCoursesVM.Instructor.CourseAssignments.Add(courseToAdd);
                }
            }

            if (await TryUpdateModelAsync <Instructor>(
                    instructorCoursesVM.Instructor,
                    "Instructor",
                    i => i.FirstMidName, i => i.LastName,
                    i => i.HireDate, i => i.OfficeAssignment))
            {
                _context.Instructors.Add(instructorCoursesVM.Instructor);
                await _context.SaveChangesAsync();

                return(RedirectToAction(nameof(Index)));
            }

            // Something went wrong. Redirect to create instructor view
            PopulateAssignedCourseData(instructorCoursesVM.Instructor);
            instructorCoursesVM.AssignedCourseDataList = this.AssignedCourseDataList;

            return(View(instructorCoursesVM));
        }