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

Tom FitzMacken

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

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

  • DeleteMethod
  • InsertMethod
  • МетодОбновления

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

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

Полный проект можно скачать в 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">

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

Принудительное применение требований к проверке

Атрибуты проверки, примененные к свойствам FirstName, LastName и Year в классе Student, автоматически применяются при обновлении данных. Элементы управления DynamicField добавляют клиентские и серверные валидаторы на основе атрибутов проверки. Оба свойства FirstName и LastName являются обязательными. FirstName не может превышать 20 символов длины, и LastName не может превышать 40 символов. Год должен быть допустимым значением перечисления 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" />

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

новая ссылка

Затем добавьте новую веб-форму с помощью главной страницы и назовите ее AddStudent. Выберите Site.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");
}

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

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

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

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

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

Conclusion

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

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