Получение и отображение данных с помощью привязки модели и веб-форм
В этой серии учебников демонстрируются основные аспекты использования привязки модели с проектом 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.
В следующем руководстве этой серии вы включите обновление, удаление и создание данных.