使用模型绑定和 Web 窗体更新、删除和创建数据

作者 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 的文件夹。 在该文件夹中,你将找到自动应用于 Web 窗体中的动态控件的模板。

动态数据文件夹

启用更新和删除

允许用户更新和删除数据库中的记录与检索数据的过程非常相似。 在 UpdateMethodDeleteMethod 属性中,指定执行这些操作的方法的名称。 使用 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">

在代码隐藏文件中,为 System.Data.Entity.Infrastructure 添加 using 语句。

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 方法将 Web 窗体中的匹配数据绑定值应用于数据项。 根据 id 参数的值检索数据项。

强制实施验证要求

更新数据时,会自动强制执行应用于 Student 类中的 FirstName、LastName 和 Year 属性的验证属性。 DynamicField 控件根据验证属性添加客户端和服务器验证程序。 FirstName 和 LastName 属性都是必需的。 FirstName 的长度不能超过 20 个字符,LastName 不能超过 40 个字符。 Year 必须是 AcademicYear 枚举的有效值。

如果用户违反验证要求之一,则更新不会继续。 若要查看错误消息,请在 GridView 上方添加 ValidationSummary 控件。 若要显示模型绑定中的验证错误,请将 ShowModelStateErrors 属性设置为 true

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

运行 Web 应用程序,并更新和删除任何记录。

更新数据

请注意,在编辑模式下,Year 属性的值将自动呈现为下拉列表。 Year 属性是枚举值,枚举值的动态数据模板指定用于编辑的下拉列表。 可以通过在 DynamicData/FieldTemplates 文件夹中打开 Enumeration_Edit.ascx 文件来查找该模板。

如果提供有效值,则更新将成功完成。 如果违反验证要求之一,则更新不会继续,并且网格上方会显示一条错误消息。

错误消息

添加新记录

GridView 控件不包含 InsertMethod 属性,因此不能用于添加具有模型绑定的新记录。 可以在 FormView、DetailsViewListView 控件中找到 InsertMethod 属性。 在本教程中,你将使用 FormView 控件添加新记录。

首先,添加一个指向要创建新记录的新页面的链接。 在 ValidationSummary 上方添加:

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

新链接将显示在“学生”页面的内容顶部。

新建链接

然后,使用母版页添加新的 Web 窗体,并将其命名为 AddStudent。 选择“Site.Master”作为母版页。

你将使用 DynamicEntity 控件呈现用于添加新学生的字段。 DynamicEntity 控件在 ItemType 属性中指定的类中呈现可编辑的属性。 StudentID 属性标有 [ScaffoldColumn (false) ] 属性,因此不会呈现它。 在 AddStudent 页的 MainContent 占位符中,添加以下代码。

<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) ,为 ContosoUniversityModelBinding.Models 命名空间添加 using 语句。

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");
}

保存所有更改。

运行 Web 应用程序并创建新学生。

添加新学生

单击“ 插入 ”,注意已创建新学生。

显示新学生

结论

在本教程中,你启用了更新、删除和创建数据。 确保与数据交互时应用验证规则。

在本系列的下一 教程 中,你将启用对数据进行排序、分页和筛选。