Обновление, удаление и создание данных с помощью привязки модели и веб-форм

; автор — Том ФитцМакен (Tom FitzMacken)

В этой серии учебников демонстрируются основные аспекты использования привязки модели с проектом ASP.NET Web Forms. Привязка модели делает взаимодействие с данными более прямым, чем работа с объектами источника данных (например, ObjectDataSource или SqlDataSource). Эта серия начинается с вводного материала и переходит к более сложным концепциям в последующих руководствах.

В этом руководстве показано, как создавать, обновлять и удалять данные с помощью привязки модели. Вы задали следующие свойства:

  • DeleteMethod
  • InsertMethod
  • UpdateMethod

Эти свойства получают имя метода, обрабатывающего соответствующую операцию. В этом методе предоставляется логика для взаимодействия с данными.

Этот учебник основан на проекте, созданном в первой части серии.

Вы можете скачать полный проект на C# или VB. Загружаемый код работает с Visual Studio 2012 или Visual Studio 2013. В нем используется шаблон Visual Studio 2012, который немного отличается от шаблона Visual Studio 2013, показанного в этом руководстве.

Содержание задачи

В этом руководстве вы выполните следующие действия.

  1. Добавление шаблонов динамических данных
  2. Включение обновления и удаления данных с помощью методов привязки модели
  3. Применение правил проверки данных — включение создания новой записи в базе данных

Добавление шаблонов динамических данных

Чтобы обеспечить оптимальное взаимодействие с пользователем и свести к минимуму повторение кода, вы будете использовать шаблоны динамических данных. Вы можете легко интегрировать готовые шаблоны динамических данных в существующий сайт, установив пакет NuGet.

В разделе Управление пакетами NuGet установите DynamicDataTemplatesCS.

динамические шаблоны данных

Обратите внимание, что проект теперь содержит папку с именем DynamicData. В этой папке вы найдете шаблоны, которые автоматически применяются к динамическим элементам управления в веб-формах.

папка динамических данных

Включение обновления и удаления

Предоставление пользователям возможности обновлять и удалять записи в базе данных очень похоже на процесс извлечения данных. В свойствах UpdateMethod и DeleteMethod укажите имена методов, выполняющих эти операции. С помощью элемента управления GridView можно также указать автоматическое создание кнопок редактирования и удаления. В следующем выделенном коде показаны дополнения к коду GridView.

<asp:GridView runat="server" ID="studentsGrid"
    ItemType="ContosoUniversityModelBinding.Models.Student" DataKeyNames="StudentID"
    SelectMethod="studentsGrid_GetData"
    UpdateMethod="studentsGrid_UpdateItem" DeleteMethod="studentsGrid_DeleteItem"
    AutoGenerateEditButton="true" AutoGenerateDeleteButton="true"  
    AutoGenerateColumns="false">

В файле кода программной части добавьте оператор using для System.Data.Entity.Infrastructure.

using System.Data.Entity.Infrastructure;

Затем добавьте следующие методы обновления и удаления.

public void studentsGrid_UpdateItem(int studentID)
{
    using (SchoolContext db = new SchoolContext())
    {
        Student item = null;
        item = db.Students.Find(studentID);
        if (item == null)
        {
            ModelState.AddModelError("", 
              String.Format("Item with id {0} was not found", studentID));
            return;
        }
              
        TryUpdateModel(item);
        if (ModelState.IsValid)
        {
            db.SaveChanges();
        }
    }
}

public void studentsGrid_DeleteItem(int studentID)
{
    using (SchoolContext db = new SchoolContext())
    {
        var item = new Student { StudentID = studentID };
        db.Entry(item).State = EntityState.Deleted;
        try
        {
            db.SaveChanges();
        }
        catch (DbUpdateConcurrencyException)
        {
            ModelState.AddModelError("", 
              String.Format("Item with id {0} no longer exists in the database.", studentID));
        }
    }
}

Метод TryUpdateModel применяет соответствующие значения, привязанные к данным из веб-формы, к элементу данных. Элемент данных извлекается на основе значения параметра id.

Применение требований к проверке

Атрибуты проверки, примененные к свойствам FirstName, LastName и Year в классе Student, применяются автоматически при обновлении данных. Элементы управления DynamicField добавляют проверяющие элементы управления клиента и сервера на основе атрибутов проверки. Свойства FirstName и LastName являются обязательными. Длина firstName не может превышать 20 символов, а длина lastName не может превышать 40 символов. Year должен быть допустимым значением для перечисления AcademicYear.

Если пользователь нарушает одно из требований проверки, обновление не продолжается. Чтобы увидеть сообщение об ошибке, добавьте элемент управления ValidationSummary над GridView. Чтобы отобразить ошибки проверки из привязки модели, задайте для свойства ShowModelStateErrors значение true.

<asp:ValidationSummary ShowModelStateErrors="true" runat="server" />

Запустите веб-приложение, обновите и удалите все записи.

обновление данных

Обратите внимание, что в режиме редактирования значение свойства Year автоматически отображается в виде раскрывающегося списка. Свойство Year является значением перечисления, а шаблон динамических данных для значения перечисления указывает раскрывающийся список для редактирования. Чтобы найти этот шаблон, откройте файл Enumeration_Edit.ascx в папке DynamicData/FieldTemplates .

Если указать допустимые значения, обновление завершается успешно. Если вы нарушаете одно из требований к проверке, обновление не продолжается, а над сеткой отображается сообщение об ошибке.

сообщение об ошибке

Добавление новых записей

Элемент управления GridView не содержит свойство InsertMethod и поэтому не может использоваться для добавления новой записи с привязкой модели. Свойство InsertMethod можно найти в элементах управления FormView, DetailsView или ListView . В этом руководстве вы будете использовать элемент управления FormView для добавления новой записи.

Сначала добавьте ссылку на новую страницу, созданную для добавления новой записи. Над validationSummary добавьте:

<asp:HyperLink NavigateUrl="~/AddStudent" Text="Add New Student" runat="server" />

Новая ссылка появится в верхней части содержимого страницы "Учащиеся".

Создать ссылку

Затем добавьте новую веб-форму с помощью страницы master и присвойте ей имя AddStudent. Выберите Site.Master в качестве страницы master.

Вы отрисовываете поля для добавления нового учащегося с помощью элемента управления DynamicEntity . Элемент управления DynamicEntity отображает редактируемые свойства в классе, указанном в свойстве ItemType. Свойство StudentID было отмечено атрибутом [ScaffoldColumn(false)] , поэтому оно не отображается. В заполнитель MainContent страницы AddStudent добавьте следующий код.

<asp:ValidationSummary runat="server" ShowModelStateErrors="true" />
<asp:FormView runat="server" ID="addStudentForm"
    ItemType="ContosoUniversityModelBinding.Models.Student" 
    InsertMethod="addStudentForm_InsertItem" DefaultMode="Insert"
    RenderOuterTable="false" OnItemInserted="addStudentForm_ItemInserted">
    <InsertItemTemplate>
        <fieldset>
            <ol>
                <asp:DynamicEntity runat="server" Mode="Insert" />
            </ol>
            <asp:Button runat="server" Text="Insert" CommandName="Insert" />
            <asp:Button runat="server" Text="Cancel" CausesValidation="false" OnClick="cancelButton_Click" />
        </fieldset>
    </InsertItemTemplate>
</asp:FormView>

В файле кода программной части (AddStudent.aspx.cs) добавьте оператор using для пространства имен ContosoUniversityModelBinding.Models .

using ContosoUniversityModelBinding.Models;

Затем добавьте следующие методы, чтобы указать, как вставить новую запись и обработчик событий для кнопки отмены.

public void addStudentForm_InsertItem()
{
    var item = new Student();
            
    TryUpdateModel(item);
    if (ModelState.IsValid)
    {
        using (SchoolContext db = new SchoolContext())
        {
            db.Students.Add(item);
            db.SaveChanges();
        }
    }
}

protected void cancelButton_Click(object sender, EventArgs e)
{
    Response.Redirect("~/Students");
}

protected void addStudentForm_ItemInserted(object sender, FormViewInsertedEventArgs e)
{
    Response.Redirect("~/Students");
}

Сохраните все изменения.

Запустите веб-приложение и создайте нового учащегося.

Добавление нового учащегося

Нажмите кнопку Вставить и обратите внимание, что новый учащийся создан.

отображение нового учащегося

Заключение

В этом руководстве вы включили обновление, удаление и создание данных. Вы обеспечили применение правил проверки при взаимодействии с данными.

В следующем руководстве этой серии вы включите сортировку, разбиение по страницам и фильтрацию данных.