Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
В этой серии учебников демонстрируются основные аспекты использования привязки модели с проектом ASP.NET Web Forms. Привязка модели делает взаимодействие с данными более прямым, чем с объектами источника данных (например, ObjectDataSource или SqlDataSource). Эта серия начинается с вводного материала и переходит к более сложным понятиям в последующих руководствах.
Шаблон привязки модели работает с любой технологией доступа к данным. В этом руководстве вы будете использовать Entity Framework, но вы можете использовать наиболее знакомую технологию доступа к данным. В серверном элементе управления с привязкой к данным, таком как GridView, ListView, DetailsView или FormView, укажите имена методов, используемых для выбора, обновления, удаления и создания данных. В этом руководстве вы укажете значение для SelectMethod.
В этом методе предоставляется логика для получения данных. В следующем руководстве вы задали значения для UpdateMethod, DeleteMethod и InsertMethod.
Полный проект можно скачать на C# или Visual Basic. Скачиваемый код работает с Visual Studio 2012 и более поздних версий. В нем используется шаблон Visual Studio 2012, который немного отличается от шаблона Visual Studio 2017, показанного в этом руководстве.
В этом руководстве вы запустите приложение в Visual Studio. Вы также можете развернуть приложение в поставщике услуг размещения и сделать его доступным через Интернет. Корпорация Майкрософт предлагает бесплатное веб-размещение до 10 веб-сайтов в
бесплатная пробная учетная запись Azure. Сведения о развертывании веб-проекта Visual Studio в Служба приложений Azure веб-приложения см. в ASP.NET веб-развертывания с помощью Visual Studio. В этом руководстве также показано, как использовать Entity Framework Code First Migrations для развертывания базы данных SQL Server в Azure SQL Database.Версии программного обеспечения, используемые в этом руководстве
- Microsoft Visual Studio 2017 или Microsoft Visual Studio Community 2017
Это руководство также работает с Visual Studio 2012 и Visual Studio 2013, но существуют некоторые различия в пользовательском интерфейсе и шаблоне проекта.
Содержание задачи
В этом руководстве вы выполните следующие действия.
- Создание объектов данных, отражающих университет со студентами, зачисленными на курсы
- Создание таблиц базы данных из объектов
- Заполнение базы данных тестовыми данными
- Отображение данных в веб-форме
Создание проекта
В Visual Studio 2017 создайте проект веб-приложения ASP.NET (платформа .NET Framework)с именем ContosoUniversityModelBinding.
Щелкните ОК. Откроется диалоговое окно для выбора шаблона.
Выберите шаблон веб-формы.
При необходимости измените проверку подлинности на Индивидуальные учетные записи пользователей.
Чтобы создать проект, щелкните ОК.
Изменение внешнего вида сайта
Внесите несколько изменений, чтобы настроить внешний вид сайта.
Откройте файл Site.Master.
Измените заголовок, чтобы отобразить Contoso University, а не My ASP.NET Application.
<title><%: Page.Title %> - Contoso University</title>Измените текст заголовка с Имя приложения на Contoso University.
<div class="navbar-header"> <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" runat="server" href="~/">Contoso University</a> </div>Измените ссылки на заголовки навигации на ссылки, соответствующие сайту.
Удалите ссылки для раздела О программе и Контакт и вместо этого создайте ссылку на страницу Учащиеся .
<ul class="nav navbar-nav"> <li><a runat="server" href="~/">Home</a></li> <li><a runat="server" href="~/Students">Students</a></li> </ul>Сохраните Site.Master.
Добавление веб-формы для отображения данных учащихся
В Обозреватель решений щелкните правой кнопкой мыши проект, выберите Добавить, а затем — Новый элемент.
В диалоговом окне Добавление нового элемента выберите шаблон Веб-форма с главной страницей и назовите его Students.aspx.
Выберите Добавить.
На странице master веб-формы выберите Site.Master.
Щелкните ОК.
Добавление модели данных
В папке Models добавьте класс с именем UniversityModels.cs.
Щелкните правой кнопкой мыши Модели, выберите Добавить, а затем — Новый элемент. Откроется диалоговое окно Добавление нового элемента.
В меню навигации слева выберите Код, а затем — Класс.
Назовите класс UniversityModels.cs и нажмите кнопку Добавить.
В этом файле определите классы
SchoolContext,Student,EnrollmentиCourseследующим образом:using System; using System.Collections.Generic; using System.Data.Entity; using System.ComponentModel.DataAnnotations; namespace ContosoUniversityModelBinding.Models { public class SchoolContext : DbContext { public DbSet<Student> Students { get; set; } public DbSet<Enrollment> Enrollments { get; set; } public DbSet<Course> Courses { get; set; } } public class Student { [Key, Display(Name = "ID")] [ScaffoldColumn(false)] public int StudentID { get; set; } [Required, StringLength(40), Display(Name="Last Name")] public string LastName { get; set; } [Required, StringLength(20), Display(Name = "First Name")] public string FirstName { get; set; } [EnumDataType(typeof(AcademicYear)), Display(Name = "Academic Year")] public AcademicYear Year { get; set; } public virtual ICollection<Enrollment> Enrollments { get; set; } } public class Enrollment { [Key] public int EnrollmentID { get; set; } public int CourseID { get; set; } public int StudentID { get; set; } public decimal? Grade { get; set; } public virtual Course Course { get; set; } public virtual Student Student { get; set; } } public class Course { [Key] public int CourseID { get; set; } public string Title { get; set; } public int Credits { get; set; } public virtual ICollection<Enrollment> Enrollments { get; set; } } public enum AcademicYear { Freshman, Sophomore, Junior, Senior } }Класс
SchoolContextявляется производным отDbContext, который управляет подключением к базе данных и изменениями в данных.StudentВ классе обратите внимание на атрибуты, применяемые к свойствамFirstName,LastNameиYear. В этом руководстве эти атрибуты используются для проверки данных. Чтобы упростить код, только эти свойства помечаются атрибутами проверки данных. В реальном проекте атрибуты проверки будут применяться ко всем свойствам, требующим проверки.Сохраните Файл UniversityModels.cs.
Настройка базы данных на основе классов
В этом руководстве используются Code First Migrations для создания объектов и таблиц базы данных. В этих таблицах хранятся сведения об учащихся и их курсах.
Выберите Инструменты>Диспетчер пакетов NuGet>Консоль диспетчера пакетов.
В консоли диспетчера пакетов выполните следующую команду:
enable-migrations -ContextTypeName ContosoUniversityModelBinding.Models.SchoolContextЕсли команда выполнена успешно, появится сообщение о том, что миграция включена.
Обратите внимание, что был создан файл с именем Configuration.cs . Класс
ConfigurationимеетSeedметод , который может предварительно заполнить таблицы базы данных тестовых данных.
Предварительное заполнение базы данных
Откройте файл Configuration.cs.
Добавьте в метод
Seedследующий код. Кроме того, добавьтеusingоператор дляContosoUniversityModelBinding. Modelsпространства имен.namespace ContosoUniversityModelBinding.Migrations { using System; using System.Data.Entity; using System.Data.Entity.Migrations; using System.Linq; using ContosoUniversityModelBinding.Models; internal sealed class Configuration : DbMigrationsConfiguration<SchoolContext> { public Configuration() { AutomaticMigrationsEnabled = false; } protected override void Seed(SchoolContext context) { context.Students.AddOrUpdate( new Student { FirstName = "Carson", LastName = "Alexander", Year = AcademicYear.Freshman }, new Student { FirstName = "Meredith", LastName = "Alonso", Year = AcademicYear.Freshman }, new Student { FirstName = "Arturo", LastName = "Anand", Year = AcademicYear.Sophomore }, new Student { FirstName = "Gytis", LastName = "Barzdukas", Year = AcademicYear.Sophomore }, new Student { FirstName = "Yan", LastName = "Li", Year = AcademicYear.Junior }, new Student { FirstName = "Peggy", LastName = "Justice", Year = AcademicYear.Junior }, new Student { FirstName = "Laura", LastName = "Norman", Year = AcademicYear.Senior }, new Student { FirstName = "Nino", LastName = "Olivetto", Year = AcademicYear.Senior } ); context.SaveChanges(); context.Courses.AddOrUpdate( new Course { Title = "Chemistry", Credits = 3 }, new Course { Title = "Microeconomics", Credits = 3 }, new Course { Title = "Macroeconomics", Credits = 3 }, new Course { Title = "Calculus", Credits = 4 }, new Course { Title = "Trigonometry", Credits = 4 }, new Course { Title = "Composition", Credits = 3 }, new Course { Title = "Literature", Credits = 4 } ); context.SaveChanges(); context.Enrollments.AddOrUpdate( new Enrollment { StudentID = 1, CourseID = 1, Grade = 1 }, new Enrollment { StudentID = 1, CourseID = 2, Grade = 3 }, new Enrollment { StudentID = 1, CourseID = 3, Grade = 1 }, new Enrollment { StudentID = 2, CourseID = 4, Grade = 2 }, new Enrollment { StudentID = 2, CourseID = 5, Grade = 4 }, new Enrollment { StudentID = 2, CourseID = 6, Grade = 4 }, new Enrollment { StudentID = 3, CourseID = 1 }, new Enrollment { StudentID = 4, CourseID = 1 }, new Enrollment { StudentID = 4, CourseID = 2, Grade = 4 }, new Enrollment { StudentID = 5, CourseID = 3, Grade = 3 }, new Enrollment { StudentID = 6, CourseID = 4 }, new Enrollment { StudentID = 7, CourseID = 5, Grade = 2 } ); context.SaveChanges(); } } }Сохраните файл Configuration.cs.
В консоли диспетчера пакетов выполните команду add-migration initial.
Выполните команду update-database.
Если при выполнении этой команды появляется исключение,
StudentIDзначения иCourseIDмогут отличаться от значенийSeedметода. Откройте эти таблицы базы данных и найдите существующие значения дляStudentIDиCourseID. Добавьте эти значения в код для заполненияEnrollmentsтаблицы.
Добавление элемента управления GridView
С заполненными данными базы данных вы можете получить эти данные и отобразить их.
Откройте Students.aspx.
MainContentНайдите заполнитель. В этом заполнитель добавьте элемент управления GridView , содержащий этот код.<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server"> <asp:GridView runat="server" ID="studentsGrid" ItemType="ContosoUniversityModelBinding.Models.Student" DataKeyNames="StudentID" SelectMethod="studentsGrid_GetData" AutoGenerateColumns="false"> <Columns> <asp:DynamicField DataField="StudentID" /> <asp:DynamicField DataField="LastName" /> <asp:DynamicField DataField="FirstName" /> <asp:DynamicField DataField="Year" /> <asp:TemplateField HeaderText="Total Credits"> <ItemTemplate> <asp:Label Text="<%# Item.Enrollments.Sum(en => en.Course.Credits) %>" runat="server" /> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> </asp:Content>Примечания.
Обратите внимание на значение, заданное
SelectMethodдля свойства в элементе GridView. Это значение указывает метод, используемый для получения данных GridView, которые вы создадите на следующем шаге.Свойству
ItemTypeприсваивается класс,Studentсозданный ранее. Этот параметр позволяет ссылаться на свойства класса в разметке. Например, классStudentимеет коллекцию с именемEnrollments. Вы можете использоватьItem.Enrollmentsдля получения этой коллекции, а затем использовать синтаксис LINQ для получения суммы зачисленных кредитов каждого учащегося.
Сохраните Students.aspx.
Добавление кода для извлечения данных
В файле кода программной части Students.aspx добавьте метод, указанный для SelectMethod значения .
Откройте файл Students.aspx.cs.
Добавьте
usingоператоры дляContosoUniversityModelBinding. Modelsпространств имен иSystem.Data.Entity.using ContosoUniversityModelBinding.Models; using System.Data.Entity;Добавьте метод, указанный для
SelectMethod:public IQueryable<Student> studentsGrid_GetData() { SchoolContext db = new SchoolContext(); var query = db.Students.Include(s => s.Enrollments.Select(e => e.Course)); return query; }Предложение
Includeповышает производительность запросов, но не требуется.IncludeБез предложения данные извлекаются с помощью отложенной загрузки, которая включает отправку отдельного запроса в базу данных при каждом получении связанных данных. При использованииIncludeпредложения данные извлекаются с помощью неотложной загрузки, что означает, что один запрос к базе данных извлекает все связанные данные. Если связанные данные не используются, неотложная загрузка будет менее эффективной, так как извлекается больше данных. Однако в этом случае неотложная загрузка обеспечивает наилучшую производительность, так как связанные данные отображаются для каждой записи.Дополнительные сведения о производительности при загрузке связанных данных см. в разделе Отложенная, неотложная и явная загрузка связанных данных статьи Чтение связанных данных с помощью Entity Framework в ASP.NET приложении MVC .
По умолчанию данные сортируются по значениям свойства, помеченного как ключ. Можно добавить
OrderByпредложение, чтобы указать другое значение сортировки. В этом примере для сортировки используется свойство по умолчаниюStudentID. В статье Сортировка, разбиение по страницам и фильтрация данных пользователь может выбрать столбец для сортировки.Сохраните Файл Students.aspx.cs.
Запуск приложения
Запустите веб-приложение (F5) и перейдите на страницу Учащиеся , где отображается следующее:
Автоматическое создание методов привязки модели
При работе с этой серией учебников можно просто скопировать код из учебника в проект. Однако одним из недостатков этого подхода является то, что вы можете не знать о функции, предоставляемой Visual Studio для автоматического создания кода для методов привязки модели. При работе над собственными проектами автоматическое создание кода сэкономит время и поможет понять, как реализовать операцию. В этом разделе описывается функция автоматического создания кода. Этот раздел является только информационным и не содержит никакого кода, который необходимо реализовать в проекте.
При задании SelectMethodзначения свойств , UpdateMethod, InsertMethodили DeleteMethod в коде разметки можно выбрать параметр Создать новый метод .
Visual Studio не только создает метод в коде программной части с правильной сигнатурой, но и создает код реализации для выполнения операции. Если сначала задать ItemType свойство перед использованием функции автоматического создания кода, созданный код будет использовать этот тип для операций. Например, при задании UpdateMethod свойства автоматически создается следующий код:
// The id parameter name should match the DataKeyNames value set on the control
public void studentsGrid_UpdateItem(int id)
{
ContosoUniversityModelBinding.Models.Student item = null;
// Load the item here, e.g. item = MyDataLayer.Find(id);
if (item == null)
{
// The item wasn't found
ModelState.AddModelError("", String.Format("Item with id {0} was not found", id));
return;
}
TryUpdateModel(item);
if (ModelState.IsValid)
{
// Save changes here, e.g. MyDataLayer.SaveChanges();
}
}
Опять же, этот код не нужно добавлять в проект. В следующем руководстве вы реализуете методы обновления, удаления и добавления новых данных.
Итоги
В этом руководстве вы создали классы модели данных и создали базу данных на основе этих классов. Вы заполнили таблицы базы данных тестовыми данными. Вы использовали привязку модели для получения данных из базы данных, а затем отображали данные в GridView.
В следующем руководстве этой серии вы включите обновление, удаление и создание данных.