为编辑与插入界面添加验证控件

本文档是 Visual Basic 教程 (切换到 Visual C# 教程)

在本教程中,我们将了解如何轻松为数据 Web 控件的 EditItemTemplate 和 InsertItemTemplate 添加验证控件,以提供更加简单的用户界面。

« 前一篇教程  |  下一篇教程 »

简介

在前三篇教程所探讨的示例中,GridView 与 DetailsView 控件全都是由 BoundField 与 CheckBoxField 组成的(当通过智能标记将 GridView 或 DetailsView 绑定到数据源控件时,Visual Studio 会自动添加这些字段类型)。当在 GridView 或 DetailsView 中编辑行时 , 那些非只读的 BoundField 会被转换为文本框 , 终端用户可在文本框中修改已有数据。同样 , 当向DetailsView 控件中插入一条新记录时 , 那些赋值为 True ( 默认 ) 的 InsertVisible 属性的 BoundField 会呈现为空文本框 , 用户可在空文本框中提供新记录的字段值。类似地,对于在标准和只读界面中禁用的 CheckBoxField ,在编辑与插入界面中被转换为已启用的复选框。

虽然默认的编辑与插入界面的 BoundField 与 CheckBoxField 有一定作用 , 但是这些界面没有任何验证功能。如果用户错误地输入了数据 , 如遗漏了ProductName 字段或者输入了无效的 UnitsInStock 值 ( 如-50 ), 将会导致应用程序架构内部发生异常。虽然如前一篇教程所示,可以正常处理这种异常,但最好使编辑或插入用户界面包含验证控件,以便在第一时间就避免了用户输入这种无效数据。

为了能提供自定义的编辑或插入界面 , 我们需要将BoundField 或 CheckBoxField 替换为TemplateField 。TemplateField 是在 GridView控件中使用 TemplateField 与在 DetailsView 控件中使用 TemplateField教程中讨论的主题 , 它包括多个模板 , 这些模板为不同的行状态定义了独立的界面。当呈现DetailsView 或 GridView 控件中的只读字段或行时 , 会用到TemplateField 的 ItemTemplate , 而 EditItemTemplate 与InsertItemTemplate 则分别表示了用作编辑与插入模式的界面。

在本教程中,我们将了解如何轻松为 TemplateField 的 EditItemTemplate 和 InsertItemTemplate 添加验证控件,以提供更加简单的用户界面。具体而言 ,本教程会使用 探讨与插入、更新、删除相关的事件教程中创建的示例,并将编辑与插入界面扩充,使其包括适当的验证功能。

步骤1 : 复制 “探讨与插入、更新、删除相关的事件” 中的示例

探讨与插入、更新、删除相关的事件教程中 , 我们创建了一个页面 , 它在可编辑的 GridView 中列出了产品的名称和价格。此外 , 这个页面包含了一个 DetailsView , 它的DefaultMode 属性被赋值为 Insert , 因此它总是呈现为插入模式。从这个DetailsView 中 , 用户可以输入新产品的名称和价格 , 单击 Insert , 将它添加到系统 ( 见图1 ) 。

图1:之前的示例允许用户添加新产品,或编辑已有产品

我们在本教程中的目标是扩充 DetailsView 与 GridView , 使其提供验证控件。尤其是 , 验证逻辑将 :

  • 要求插入或编辑产品时必须提供产品名称
  • 要求插入记录时必须提供价格 ; 当编辑记录时 , 我们也要求必须提供价格 , 但我们将使用 GridView 的 RowUpdating event handler 中的程序逻辑来实现这个功能 , 这在前面的教程中已经完成了
  • 确保输入的价格值是有效的货币格式

在我们研究怎样扩充之前的示例以包含验证之前 , 我们首先要将DataModificationEvents.aspx 页面中的示例复制到本教程的页面 ,UIValidation.aspx 中来。为此 , 我们需要复制DataModificationEvents.aspx 页面的声明式标记及其源代码。执行以下步骤获得声明式标记的第一个拷贝 :

  1. 在 Visual Studio 中打开 DataModificationEvents.aspx 页面
  2. 转到页面的声明式标记 ( 单击页面下方的 Source 按钮 )
  3. 复制 <asp:Content> 和 </asp:Content> 标记 ( 第 3 行至第 44 行 ) 内的文本 , 如图 2 所示。

图2:复制 控件内的文本

  1. 打开 UIValidation.aspx 页面
  2. 转到页面的声明式标记
  3. 在 <asp:Content> 控件内粘贴文本。

要复制源代码 , 打开DataModificationEvents.aspx.vb 页面 , 仅复制 EditInsertDelete_DataModificationEvents 类之内的文本。复制三个 event handler (Page_Load 、GridView1_RowUpdating 、ObjectDataSource1_Inserting) , 但是不要复制类声明。将复制的文本粘贴到 UIValidation.aspx.vb 中的 EditInsertDelete_UIValidation 类之内

将DataModificationEvents.aspx 中的内容及代码移到UIValidation.aspx 之后 , 花点时间在浏览器中测试一下您的进度。在这两个页面中 , 您应该看到相同的输出 , 体验到相同的功能 ( 回头参考图1 , 可以得到运行中 DataModificationEvents.aspx 的屏幕截图 ) 。

步骤2 : 将BoundField转换为TemplateField

要向编辑与插入界面添加验证控件 , 需要将 DetailsView 与 GridView 控件使用的 BoundField 转换为 TemplateField 。为此 , 分别单击 GridView 与 DetailsView 的智能标记中的 Edit Columns 与 Edit Fields 链接。在那里选择各 BoundField ,并单击“ Convert this field into a TemplateField ”链接。

图3:将DetailsView与GridView的每个BoundField都转换为TemplateField

在Fields 对话框中将 BoundField 转换为TemplateField 时 , 会生成一个 TemplateField , 它与BoundField 一样提供 只读、编辑和插入界面。下面的标记显示的是当DetailsView 中的 ProductName 字段被转换为TemplateField 之后的声明式语法 :

<asp:TemplateField HeaderText="ProductName" SortExpression="ProductName">
    <EditItemTemplate>
        <asp:TextBox ID="TextBox1" runat="server"
         Text='<%# Bind("ProductName") %>'></asp:TextBox>
    </EditItemTemplate>
    <InsertItemTemplate>
        <asp:TextBox ID="TextBox1" runat="server"
         Text='<%# Bind("ProductName") %>'></asp:TextBox>
    </InsertItemTemplate>
    <ItemTemplate>
        <asp:Label ID="Label1" runat="server"
         Text='<%# Bind("ProductName") %>'></asp:Label>
    </ItemTemplate>
</asp:TemplateField>

注意 , 这个TemplateField 自动创建了三个模板 :ItemTemplate 、EditItemTemplate 与 InsertItemTemplate 。ItemTemplate 使用 Label Web 控件来显示单个数据字段值 (ProductName ),EditItemTemplate 与 InsertItemTemplate 在 TextBox Web 控件中显示数据字段值 , 这个控件使用双向数据绑定 , 将数据字段与TextBox 的 Text 属性相关联。因为在此页面中我们仅使用DetailsView 进行插入 , 您可以从两个TemplateField 中删除 ItemTemplate 与 EditItemTemplate , 不过把它们留在那里也没关系。

因为 GridView 不支持 DetailsView 内置的插入功能 , 所以将 GridView 的 ProductName 字段转换为 TemplateField 时 , 将只产生 ItemTemplate 与 EditItemTemplate :

<asp:TemplateField HeaderText="ProductName" SortExpression="ProductName">
    <EditItemTemplate>
        <asp:TextBox ID="TextBox1" runat="server"
         Text='<%# Bind("ProductName") %>'></asp:TextBox>
    </EditItemTemplate>
    <ItemTemplate>
        <asp:Label ID="Label1" runat="server"
          Text='<%# Bind("ProductName") %>'></asp:Label>
    </ItemTemplate>
</asp:TemplateField>

单击 “Convert this field into a TemplateField ” 之后 ,Visual Studio 就创建了一个 TemplateField , 它的模板模拟了已转换 BoundField 的用户界面。您可以使用浏览器访问这个页面,以验证这点。这时会发现 ,TemplateField 的外观与行为都与使用 BoundField 时的体验一样。

注意 :您可以按需要随意自定义模板中的编辑界面。例如 , 我们可能想让UnitPrice TemplateField 中的 TextBox 呈现得比 ProductName 文本框小一些。为此,可以为TextBox 的 Columns 属性进行合适的赋值 , 或者通过 Width 属性提供一个绝对宽度。在下一篇教程中,我们将了解怎样通过把 TextBox 替换为另一数据输入 Web 控件的方法来完全自定义编辑界面。

步骤3 : 向GridView 的EditItemTemplate 添加验证控件

当构建数据输入表单时 , 用户要输入所有必需的字段 , 所提供的所有输入都必须是合法的、格式正确的值 , 这点很重要。为了帮助确保用户的输入有效, ASP.NET 提供了五个内置的验证控件,它们旨在用来对单个输入控件的值进行验证:

查看 ASP.NET 快速入门教程 中的验证控件一节 , 可了解 有关这五个控件的更多信息。

对于我们的教程来说 , 我们需要在DetailsView 与 GridView 的ProductName TemplateField 中都使用 RequiredFieldValidator , 还要在DetailsView 的 UnitPrice TemplateField 中使用RequiredFieldValidator 。此外 , 我们需要为两个控件的UnitPrice TemplateField 添加 CompareValidator , 以确保输入的价格大于或等于0 , 并且是有效的货币格式。

注意 : 虽然 ASP.NET 1.x 同样 只有这五个验证控件 , 但是 ASP.NET 2.0 又加入了很多改进 , 其中最主要的两个是除Internet Explorer 之外的浏览器 客户端脚本支持 , 以及将页面上的验证控件分为组的能力。有关2.0 版中新增验证控件特性的更多信息 , 请参考剖析 ASP.NET 2.0 的验证控件

我们从给 GridView 的 TemplateField 中的EditItemTemplate 添加一个RequiredFieldValidator 验证控件 开始 。为此 , 需要单击 GridView 的智能标记中的 Edit Templates 链接 , 显示出模板编辑界面。在这里,可以从下拉列表中选择需要编辑的模板。因为我们要扩充编辑界面,所以我们需要为 ProductName 与 UnitPrice 的 EditItemTemplate 添加验证控件。

图4:我们需要扩充 ProductName 与 UnitPrice 的 EditItemTemplate

在ProductName EditItemTemplate 中 , 添加一个RequiredFieldValidator , 方法是将它从 Toolbox 拖动到模板编辑界面内 , 放在 TextBox 之后。

图5:为 ProductName EditItemTemplate 添加一个 RequiredFieldValidator

所有验证控件的作用是验证单个ASP.NET Web 控件的输入。因此,我们需要指明 , 刚才添加的RequiredFieldValidator 应该对EditItemTemplate 中的TextBox 进行验证 ; 通过将验证控件的ControlToValidate 属性 赋值为适当Web 控件的 ID 就可以做到这点。目前 ,TextBox 的 ID 是 TextBox1 , 没什么特点 , 让我们来将它改得更合适一些。单击模板中的TextBox , 然后从Properties 窗口将 ID 由 TextBox1 改为EditProductName 。

图6:将 TextBox 的 ID 改为 EditProductName

接下来 , 将RequiredFieldValidator 的 ControlToValidate 属性赋值为 EditProductName 。最后 , 将 ErrorMessage 属性 赋值为 “You must provide the product's name ”,并 将 Text 属性 赋值为 “* ” 。如果给出 Text 属性值,验证失败时将由验证控件显示该文本。ErrorMessage 属性值是必需的 ,由 ValidationSummary 控件使用 ; 如果没有输入Text 属性值 , 那么在无效输入时 ,ErrorMessage 属性值也会成为验证控件的显示文本。

设置RequiredFieldValidator 的这三个属性后 , 屏幕显示类似图7 。

图7:为 RequiredFieldValidator 的 ControlToValidate、ErrorMessage 以及 Text 属性赋值

为ProductName EditItemTemplate 添加完RequiredFieldValidator 之后 , 剩下的工作就是为UnitPrice EditItemTemplate 添加必要的验证。对于本页面来说 , 因为我们已经决定编辑记录时UnitPrice 为可选 , 所以我们不需要添加RequiredFieldValidator 。不过 , 我们确实需要添加一个CompareValidator , 确保将UnitPrice ( 如果有 ) 的格式正确设置为货币并且值大于或等于0 。

在我们为UnitPrice EditItemTemplate 添加 CompareValidator 之前 , 我们先将TextBox Web 控件的 ID 从 TextBox2 改为 EditUnitPrice 。做完这个更改之后 , 添加 CompareValidator , 将其ControlToValidate 属性赋值为 EditUnitPrice , 其ErrorMessage 属性赋值为 “The price must be greater than or equal to zero and cannot include the currency symbol ”, 以及其 Text 属性赋值为 “* ” 。

要指明 UnitPrice 值必须大于或等于 0 , 需要将CompareValidator 的 Operator 属性 赋值为GreaterThanEqual , 其 ValueToCompare 属性 赋值为 “0 ”, 且其 Type 属性 赋值为 Currency 。下面的声明式语法显示了完成这些更改后 的 UnitPrice TemplateField 的EditItemTemplate :

<EditItemTemplate>
    <asp:TextBox ID="EditUnitPrice" runat="server"
      Text='<%# Bind("UnitPrice", "{0:c}") %>'
      Columns="6"></asp:TextBox>
    <asp:CompareValidator ID="CompareValidator1" runat="server"
        ControlToValidate="EditUnitPrice"
        ErrorMessage="The price must be greater than or equal to zero and
                       cannot include the currency symbol"
        Operator="GreaterThanEqual" Type="Currency"
        ValueToCompare="0">*</asp:CompareValidator>
</EditItemTemplate>

做完这些更改后 , 在浏览器中打开页面。如果编辑产品时试图忽略名称或者输入无效的价格,文本框旁边将显示一个星号。如图 8 所示,包含货币符号的价格值,如 $19.95 ,被认为是无效值。CompareValidator 的 Currency Type 允许有数字分隔符 ( 例如逗号或句号 ,其用法 取决于不同的区域设置 ) 以及前面的加号或减号 , 但是允许有货币符号。当正在编辑的界面呈现货币格式的UnitPrice 时 , 这种行为可能使用户疑惑。

注意 : 回想一下 , 在与插入、更新、删除相关的事件教程中 , 我们将BoundField 的 DataFormatString 属性赋值为 {0:c} , 令它变为货币格式。此外 , 我们将ApplyFormatInEditMode 属性赋值为true , 这导致GridView 的编辑界面将 UnitPrice 显示为货币格式。将 BoundField 转换为 TemplateField 时 ,Visual Studio 注意到了这些设置 , 所以使用数据绑定语法 <%# Bind("UnitPrice", "{0:c}") %> , 将TextBox 的 Text 属性设为货币格式。

图8:无效输入时,文本框旁边显示一个星号

尽管验证仍然起作用 , 但是用户编辑记录时必须手工删除货币符号 , 这让人无法接受。为了解决这个问题,我们有三个选择:

  1. 配置 EditItemTemplate , 使得 UnitPrice 值不是货币格式。
  2. 允许用户输入货币符号 , 方法是删除 CompareValidator , 并替换为 RegularExpressionValidator , 它能对正确的货币格式值进行合适的检查。这里的问题是,用来验证货币值的正则表达式不太完备,如果我们想包括区域设置,就需要编写代码。
  3. 完全删除验证控件 , 寄希望于服务器端 GridView 的 RowUpdating event handler 中的验证逻辑。

对于本练习 , 我们使用第1 个选择。目前 ,UnitPrice 是货币格式 , 原因是EditItemTemplate 中 TextBox 的数据绑定表达式 :<%# Bind("UnitPrice", "{0:c}") %> 。将 Bind 语句改为 Bind("UnitPrice", "{0:n2}") , 就可以将结果转化为数值格式 , 精确度为两位数。要做到这点 , 可以直接通过声明式语法 , 或者单击UnitPrice TemplateField 的 EditItemTemplate 中 EditUnitPrice TextBox 的 Edit DataBindings 链接 ( 见图9 与图10 )。

图9:单击 TextBox 的 Edit DataBindings 链接

图10:在 Bind 语句中指定格式规范

更改后 , 正在编辑界面中的格式化价格包含有逗号作为组分隔符 , 句号作为小数点分隔符 , 但停止使用货币符号。

注意 :UnitPrice EditItemTemplate 不包括 RequiredFieldValidator , 这允许发生回传以及 启动 更新逻辑。然而 , 从对深入了解与插入、更新、删除相关的事件教程中复制过来的RowUpdating event handler 包括了程序检查 , 它能确保提供了 UnitPrice 。可删除或保留这一逻辑 , 或向UnitPrice EditItemTemplate 添加一个RequiredFieldValidator 。

步骤4 : 汇总数据输入问题

除了五个验证控件 ,ASP.NET 还包含 ValidationSummary 控件 , 该控件显示检测到无效数据的验证控件的错误消息。该汇总数据可以在网页上以文本方式显示,也可以通过模式客户端消息框显示。我们来增强本教程的功能,使其包含一个能对所有验证问题进行汇总的客户端消息框。

为此 , 需要从工具箱拖拉一个 ValidationSummary 控件到 Designer 。Validation 控件的位置其实并不重要 , 因为我们将会对它配置为一个显示汇总信息的消息框。添加完该控件之后,将其ShowSummary 属性 赋值为 False ,其 ShowMessageBox 属性 赋值为 True 。通过这些添加 , 所有验证错误都会汇总到客户端的消息框中。

图11:验证错误被汇总到客户端的消息框中

步骤5 : 向DetailsView 的InsertItemTemplate 添加验证控件

本教程的其余部分是向 DetailsView 的插入界面添加验证控件。为DetailsView 的模板添加验证控件的过程与步骤3 相同 ; 因此 , 可轻松完成本步骤中的任务。正如我们对GridView 的 EditItemTemplate 操作那样 , 鼓励将TextBox 的 ID 重命名 , 将没什么特点的 TextBox1 与 TextBox2 改为 InsertProductName 与InsertUnitPrice 。

为ProductName InsertItemTemplate 添加一个 RequiredFieldValidator 。将 ControlToValidate 赋值为模板中 TextBox 的 ID , 将其 Text 属性赋值为 “* ”,并 将其 ErrorMessage 属性赋值为 “You must provide the product's name ” 。

因为添加新记录时需要为本页面提供 UnitPrice , 所以为 UnitPrice InsertItemTemplate 添加一个RequiredFieldValidator ,并 为其 ControlToValidate 、Text 、ErrorMessage 属性进行正确赋值。最后 , 也为 UnitPrice InsertItemTemplate 添加一个 CompareValidator ,并 对其ControlToValidate 、Text 、ErrorMessage 、Type 、Operator 、ValueToCompare 属性进行配置 , 同GridView 的 EditItemTemplate 中 UnitPrice 的 CompareValidator 配置方法 。

添加完这些验证控件之后,如果没有提供产品名称,或者产品价格是负数,或格式不对,那么新产品就无法添加到系统。

图12:已添加到DetailsView的插入界面的验证逻辑

步骤6 : 将验证控件分组

我们的页面包含两组逻辑独立的验证控件 : 一组对应于 GridView 的编辑界面 , 一组对应于 DetailsView 的插入界面。默认情况下,当发生回传时,页面上的所有验证控件都会执行检查。然而,当编辑记录时,我们并不希望 DetailsView 的插入界面的验证控件执行验证。图 13 说明了我们现在两难境地:当用户使用完全合法的值编辑产品时,单击 Update 却会导致验证错误,原因是插入界面中的名称与价格值为空。

图13:更新产品却触发插入界面的验证控件

ASP.NET 2.0 中的验证控件可通过其 ValidationGroup 属性分为验证组。要将一系列验证控件归为一组 ,只需 将它们的ValidationGroup 属性设为相同的值就可以了。对我们的教程而言 , 需要将 GridView 的TemplateField 中验证控件的ValidationGroup 属性赋值为EditValidationControls , 将 DetailsView 的TemplateField 的 ValidationGroup 属性赋值为InsertValidationControls 。可以直接在声明式标记中进行这些更改 , 或者在使用 Designer 的编辑模板界面时通过 Properties 窗口进行更改。

除了验证控件之外 ,ASP.NET 2.0 中Button 还有与Button 相关的控件也包含ValidationGroup 属性。当某个 Button 引起回传时 , 只有与它具有相同 ValidationGroup 属性设置的验证组成员才会进行验证。例如 , 如果让 DetailsView 的 Insert 按钮触发InsertValidationControls 验证组 , 我们需要将CommandField 的 ValidationGroup 属性赋值为InsertValidationControls ( 见图14 ) 。此外 , 将GridView 的 CommandField 的 ValidationGroup 属性赋值为EditValidationControls 。

图14:将DetailsView的CommandField的ValidationGroup属性赋值为InsertValidationControls

进行完这些更改之后 ,DetailsView 与 GridView 的 TemplateField 与CommandField 应如下所示 :

DetailsView 的TemplateField 与 CommandField :

<asp:TemplateField HeaderText="ProductName"
  SortExpression="ProductName">
    <InsertItemTemplate>
        <asp:TextBox ID="InsertProductName" runat="server"
         Text='<%# Bind("ProductName") %>'></asp:TextBox>
        <asp:RequiredFieldValidator ID="RequiredFieldValidator2"
          runat="server" ControlToValidate="InsertProductName"
            ErrorMessage="You must provide the product name"
            ValidationGroup="InsertValidationControls">*
        </asp:RequiredFieldValidator>
    </InsertItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="UnitPrice" SortExpression="UnitPrice">
    <InsertItemTemplate>
         <asp:TextBox ID="InsertUnitPrice" runat="server"
           Text='<%# Bind("UnitPrice") %>' Columns="6">
         </asp:TextBox>
         <asp:RequiredFieldValidator ID="RequiredFieldValidator3"
           runat="server" ControlToValidate="InsertUnitPrice"
            ErrorMessage="You must provide the product price"
            ValidationGroup="InsertValidationControls">*
         </asp:RequiredFieldValidator>
        <asp:CompareValidator ID="CompareValidator2" runat="server"
           ControlToValidate="InsertUnitPrice"
           ErrorMessage="The price must be greater than or equal to zero and
                          cannot include the currency symbol"
           Operator="GreaterThanEqual" Type="Currency" ValueToCompare="0"
           ValidationGroup="InsertValidationControls">*
        </asp:CompareValidator>
     </InsertItemTemplate>
 </asp:TemplateField>
<asp:CommandField ShowInsertButton="True"
  ValidationGroup="InsertValidationControls" />

GridView 的 CommandField 与 TemplateField :

<asp:commandfield showeditbutton="True" validationgroup="EditValidationControls" />
    <asp:templatefield headertext="ProductName" sortexpression="ProductName">
        <edititemtemplate>
            <asp:TextBox ID="EditProductName" runat="server"
              Text='<%# Bind("ProductName") %>'>
            </asp:TextBox>
            <asp:RequiredFieldValidator ID="RequiredFieldValidator1"
            runat="server" ControlToValidate="EditProductName"
            ErrorMessage="You must provide the product name" ValidationGroup="EditValidationControls">* 
            </asp:RequiredFieldValidator> 
        </edititemtemplate>
        <itemtemplate> <asp:Label ID="Label1" runat="server" Text='<%# Bind("ProductName") %>'></asp:Label> </itemtemplate>
    </asp:templatefield>
    <asp:templatefield headertext="UnitPrice" sortexpression="UnitPrice">
        <edititemtemplate> 
            <asp:TextBox ID="EditUnitPrice" runat="server" Text='<%# Bind("UnitPrice", "{0:n2}") %>' Columns="6"></asp:TextBox> 
            <asp:CompareValidator ID="CompareValidator1" runat="server" 
                ControlToValidate="EditUnitPrice" 
                ErrorMessage="The price must be greater than or equal to zero and cannot include the currency symbol" 
                Operator="GreaterThanEqual" Type="Currency" ValueToCompare="0" 
                ValidationGroup="EditValidationControls">* 
            </asp:CompareValidator> 
        </edititemtemplate>
        <itemtemplate> 
            <asp:Label ID="Label2" runat="server" Text='<%# Bind("UnitPrice", "{0:c}") %>'> </asp:Label> 
        </itemtemplate>
    </asp:templatefield>

此时 , 与编辑相关的验证控件仅当单击GridView 的 Update 按钮时才会触发 , 与插入相关的验证控件仅当单击DetailsView 的 Insert 按钮时才会触发 , 这就解决了图 13 中突显的问题。然而,进行这一更改之后,当输入无效数据时,我们的 ValidationSummary 控件就不再显示了。 ValidationSummary 控件也包含 ValidationGroup 属性,它只为自己验证组中的那些验证控件显示汇总信息。因此,我们在本页面中需要有两个验证控件,一个针对 InsertValidationControls 验证组,一个则针对 EditValidationControls 。

<asp:ValidationSummary ID="ValidationSummary1" runat="server"
    ShowMessageBox="True" ShowSummary="False"
    ValidationGroup="EditValidationControls" />
<asp:ValidationSummary ID="ValidationSummary2" runat="server"
    ShowMessageBox="True" ShowSummary="False"
    ValidationGroup="InsertValidationControls" />

将这加入之后 , 我们的教程就完成了 !

小结

虽然BoundField 可以提供插入与编辑界面 , 但是这种界面无法自定义。一般情况下,我们希望为编辑与插入界面添加验证控件,以确保用户的输入合法。为此 , 我们必须将BoundField 转换为 TemplateField , 并向适当的模板添加验证控件。在本教程中 , 我们扩充了深入了解与插入、更新、删除相关的事件教程中的示例 , 向DetailsView 的插入界面与 GridView 的编辑界面都添加了验证控件。此外 , 我们了解了如何使用 ValidationSummary 控件来显示汇总的验证信息 , 以及如何将页面上的验证控件分为不同的验证组。

正如本教程中所介绍的 ,TemplateField 允许扩充编辑与插入界面 , 以包含验证控件。还可以扩充 TemplateField , 以包含更多的输入 Web 控件 ,从而由更适合的 Web 控件 来替换TextBox 。下一篇教程中,我们将介绍如何将 TextBox 控件替换为数据绑定的 DropDownList 控件(该控件最适合用于编辑外键,如Products 表中的 CategoryID 或SupplierID )。

快乐编程 !





下一篇教程