Новые Лпр-ки. Веб ЛПР новые (1). Лабораторная работа Разработка базовой основы Web приложения 5 Упражнение Создание Web приложения 5
Скачать 1.04 Mb.
|
Упражнение 2. Применение отношения многое ко многимОтношения между Courses и People многие-ко-многим. В этом упражнении вы будете добавлять и удалять отношения между Person Человек и Course курс лиц, обновляя свойства навигации соответствующих сущностей. Создайте новую страницу InstructorsCourses.aspx которая основана на мастер странице Site.Master и добавьте код разметки элемента Content с именем Content2: Assign Instructors to Courses or Remove from CoursesConnectionString="name=SchoolEntities" DefaultContainerName="SchoolEntities" EnableFlattening="False" EntitySetName="People" Where="it.HireDate is not null" Select="it.LastName + ', ' + it.FirstMidName AS Name, it.PersonID"> AutoPostBack="true" DataTextField="Name" DataValueField="PersonID" OnSelectedIndexChanged="InstructorsDropDownList_SelectedIndexCh anged" OnDataBound="InstructorsDropDownList_DataBound">
Select a Course: DataTextField="Title" DataValueField="CourseID">
Select a Course: DataTextField="title" DataValueField="courseiD"> Это код разметки создает элемент EntityDataSource, который извлекает имя и PersonId объекта Person для инструкторов. Элемент DropDrownList связан с элементом EntityDataSource. DropDrownList определяет обработчик для события DataBound с привязкой к данным. Вы будете использовать этот обработчик привязки двух раскрывающихся списков, которые отображают курсы. Разметка также создает следующую группу элементов управления, чтобы использовать их для присвоения курса к выбранному инструктору: DropDownList для выбора назначаемого курса. Этот элемент будет заполнен курсами, которые в настоящее время не назначенные выбранному инструктору. Button для начала выполнения действия. Label для отображения сообщения об ошибке. Наконец, разметка также создает группу элементов управления, чтобы использовать удаление курса для выбранного инструктора. В файл InstructorsCourses.aspx.csдобавьте выражение using: using ContosoUniversity.DAL; Добавьте метод для заполнения двух выпадающих списков, отображающих курсы: private void PopulateDropDownLists() { using (var context = new SchoolEntities()) { var allCourses = (from c in context.Courses select c).ToList(); var instructorID = Convert.ToInt32(InstructorsDropDownList.SelectedValue); var instructor = (from p in context.People.Include("Courses") where p.PersonID == instructorID select p).First(); var assignedCourses = instructor.Courses.ToList(); var unassignedCourses = allCourses.Except(assignedCourses.AsEnumerable()).ToList(); UnassignedCoursesDropDownList.DataSource = unassignedCourses; UnassignedCoursesDropDownList.DataBind(); UnassignedCoursesDropDownList.Visible = true; AssignedCoursesDropDownList.DataSource = assignedCourses; AssignedCoursesDropDownList.DataBind(); AssignedCoursesDropDownList.Visible = true; } } В методе выполняется запрос получения всех курсов. Затем определяется, какие курсы назначаются для инструктора и заполняются соответствующие раскрывающиеся списки, Добавьте обработчик события Click для кнопки Assign: protected void AssignCourseButton_Click(object sender, EventArgs e) { using (var context = new SchoolEntities()) { var instructorID = Convert.ToInt32(InstructorsDropDownList.SelectedValue); var instructor = (from p in context.People where p.PersonID == instructorID select p).First(); var courseID = Convert.ToInt32(UnassignedCoursesDropDownList.SelectedValue); var course = (from c in context.Courses where c.CourseID == courseID select c).First(); instructor.Courses.Add(course); try { successful."; context.SaveChanges(); PopulateDropDownLists(); CourseAssignedLabel.Text = "Assignment } catch (Exception) { unsuccessful."; } CourseAssignedLabel.Text = "Assignment //Add code to log the error. CourseAssignedLabel.Visible = true; } } В методе реализовывается получение объекта Person для выбранного инструктора, получение объекта Course для выбранного курса, и добавление выбранного курса для свойства навигации Courses для сущности Person. Затем сохраняются изменения в базу данных и повторно заполняются раскрывающиеся списки, так что результаты можно увидеть сразу. Добавьте обработчик события Click для кнопки Remove: protected void RemoveCourseButton_Click(object sender, EventArgs e) { using (var context = new SchoolEntities()) { var instructorID = Convert.ToInt32(InstructorsDropDownList.SelectedValue); var instructor = (from p in context.People where p.PersonID == instructorID select p).First(); var courseID = Convert.ToInt32(AssignedCoursesDropDownList.SelectedValue); var courses = instructor.Courses; var courseToRemove = new Course(); foreach (Course c in courses) { if (c.CourseID == courseID) { } } try { courseToRemove = c; break; successful."; courses.Remove(courseToRemove); context.SaveChanges(); PopulateDropDownLists(); CourseRemovedLabel.Text = "Removal } catch (Exception) { unsuccessful."; } CourseRemovedLabel.Text = "Removal //Add code to log the error. CourseRemovedLabel.Visible = true; } } В методе реализовывается получение объекта Person для выбранного инструктора, получение объекта Course для выбранного курса, и удаление выбранного курса для свойства навигации Courses для сущности Person. Затем сохраняются изменения в базу данных и повторно заполняются раскрывающиеся списки, так что результаты можно увидеть сразу. Добавьте реализацию обработчика события загрузки страницы Page_Load, в котором реализуется скрытие сообщений об ошибках в случае их отсутствия protected void Page_Load(object sender, EventArgs e) { CourseAssignedLabel.Visible = false; CourseRemovedLabel.Visible = false; } Добавьте обработчики событий DataBound и SelectedIndexChanged выпадающего списка инструкторов: protected void InstructorsDropDownList_DataBound(object sender, EventArgs e) { PopulateDropDownLists(); } protected void InstructorsDropDownList_SelectedIndexChanged(object sender, EventArgs e) { PopulateDropDownLists(); } Запустите страницу в обозревателе. Выберите инструктора. В выпадающем списке Assign a Course выберите курс и нажмите кнопку Assign. Перейдите на страницу списка инструкторов. Выберите инструктора и убедитесь, что курс добавился для этого инструктора. |