介绍
到目前为止,编辑数据列表的教程没有包含任何验证用户的输入,即使用户的非法输入——缺少产品名称或负价格——也会导致异常。在前一章中,我们学习了如何将异常处理代码添加到DataList的UpdateCommand事件处理中,以便在异常发生时捕捉到它并显示友好的错误消息。然而,理想的编辑界面应该包括验证控件,以防止用户在第一时间输入一些非法数据。
在本章中,我们将学习在DataList的EditItemTemplate中添加验证控件,以提供更安全的编辑界面,这非常容易。本章将使用前面创建的示例,并扩展编辑界面以添加适当的验证控件。
第一步,复制了一个处理BLL和DAL异常的例子。
在处理BLL和DAL的异常时,我们创建了一个数据列表,它在两列中列出了产品的名称和价格。本章的目标是扩展该数据列表的编辑界面,以包括验证控件。我们的验证逻辑如下:
需要的productname。确保输入的价格值为法定货币类型格式。确保输入的价格值大于或等于0。
首先,我们需要将ErrorHandling.aspx页面的示例复制到UIValidation.aspx中,这包括页面的声明代码和背景代码。以下是复制声明代码的步骤:
在Visual Studio中打开ErrorHandling.aspx,切换到源代码视图,将标签中的代码从asp:Content复制到/asp:Content,如图1所示。
图1:复制asp:Content中的代码。
打开UIValidation.aspx切换到源代码视图并粘贴代码。
完成上述步骤后,打开ErrorHandling.asxp.cs,复制DispalyExcetionDetails方法和三个事件处理程序(products _ editcommand、products _ cancelcommand和Products_UpdateCommand),注意不要复制声明类和使用代码。将代码粘贴到ErrorHandling.asxp.cs中的editdeletedatalist _ ui validation类中.完成后,浏览页面。这两个页面在输出和功能上都是相同的(见图2)。
图2: UIValidation.aspx页面与ErrorHandling.aspx相同
步骤:为数据列表的编辑项目模板添加验证控件。
创建输入表单时,声明必填字段和用户输入必须是格式正确的合法值非常重要。为了确保用户输入是合法的,ASP.NET提供了五个内置的验证控件,用于验证单个输入控件中的输入值。
requiredfieldvalidator-确保必需的值comparevalidator-根据另一个控件的值或常数验证一个值。或者确保输入值属于特定类型,范围验证器—确保输入值在特定范围内,正则表达式验证器—根据正则表达式验证值,自定义验证器—根据用户定义的方法验证值。
有关这五个控件的更多信息,请参考将验证控件添加到编辑和添加界面,或添加到ASP.NET快速入门教程中的验证控件部分。
在本章中,我们需要使用RequiredFieldValidator来确保用户已经输入了产品的名称,使用CompareValidator来确保price的值大于或等于0并且是合法的货币格式。
注意:这些验证控制已经包含在ASP.NET 1 . x中,并且在ASP.NET 2.0中有许多改进。最重要的一点是对IE以外的浏览器的客户端脚本支持,另一点是对同一页面上的身份验证控件的分组。有关2.0版中验证控件新功能的更多信息,请参考在ASP.NET 2.0版中中断验证控件。
现在,让我们将所需的验证控件添加到数据列表的编辑项目模板中。这可以通过单击数据列表智能标记上的编辑模板或直接编写声明代码来完成。我们在这里使用第一种方法。选择编辑模板,并在中拖动一个RequiredFieldValidator,将其放在产品名称文本框后面。
图3:添加必需字段验证器。
所有的验证控件都只验证一个Web控件。因此,我们需要指出,刚才添加的RequiredFieldValidator用于验证ProductName文本框。通过将验证控件的ControlToValidate属性设置为合适的Web控件(在本例中为ProductName),然后将ErrorMessage属性设置为“您必须提供产品的名称”,并将Text属性设置为“*”来建立关联。如果为文本属性提供了值,则验证失败时将显示该值。为ValidationSummary控件提供了ErrorMessage属性。如果省略文本的值,当非法输入时,将显示错误消息。之后,您的页面应该类似于图4:
图4:设置RequiredFieldValidator的控件验证、错误消息和文本属性。
添加RequiredFieldValidator后,剩下的就是为产品价格添加一个验证控件。编辑时,单价是可选的,所以我们不需要添加RequiredFieldValidator。我们需要做的是添加一个CompareValidator,以确保输入价格时,其值采用正确的货币格式,并且大于或等于0。
为编辑模板添加一个控件验证属性为单价的比较器。将错误消息设置为“价格必须大于或等于零,并且不能包含货币符号”,将文本设置为“*”。若要指定单价的值必须大于或等于0,请将比较器的运算符属性设置为“更大”,将比较器的值设置为“0”,并将类型属性设置为“货币”。添加这两个验证控件后,DataList的EditItemTemplate的声明代码应该类似于下面这样:
EditItemTemplate产品名称: asp: extbox ID=' Product name ' runat=' server ' Text=' % # Eval(' Product name ')% '/asp: extbox asp: requiredfieldvalidator ID=' requiredfieldvalidator 1 ' ControlToValidate=' Product name ' error message='您必须提供产品名称' runat=' server ' */asp: requiredfieldvalidator br/price :如果编辑时不输入名称或在价格中输入非法值,文本框后会出现一个“*”。参见图5。包含货币符号的值,如$19.95,被认为是合法的。CompareValidator的“货币”类型允许数字分隔符(如句点和逗号)以“”或“-”开头,但不允许货币符号。编辑界面的单价会以货币格式显示,可能会让用户感到困惑。
非法进入文本框后会出现图5:“*”。
当验证控件如上工作时,用户需要在编辑时手动移除货币符号,这是不可接受的。此外,如果编辑过程中有非法输入,无论是单击“更新”还是“取消”按钮,页面都会回发。理想情况下,单击取消按钮将返回到数据列表的预编辑状态,而不管输入的值是否合法。当然,因为用户的浏览器可能不支持JavaScript或者被禁用,所以在更新产品信息之前,我们应该确保在UpdateCommand事件处理中页面上的数据是合法的。
从编辑项目模板的单价文本框中删除货币符号。
当使用CompareValidator的货币类型时,输入不能包含任何货币符号,否则CompareValidator将被视为非法。但是,编辑界面中的单价文本框已经包含货币符号,这意味着用户必须在保存之前手动删除它。我们有三种解决方法:
编辑项目模板被配置为单位价格文本框的值的格式不是货币。正则表达式验证器代替比较器来检查货币值的格式是否正确。这里的挑战是,使用正则表达式不如使用CompareValidator那样直接和方便,并且需要编写一些代码。移除所有验证控件,验证函数将完全依赖于服务器端GridView的RowUpdating事件处理。
我们在这里使用第一种方法。UnitPrice现在采用货币格式的原因是TextBox的绑定表达式% # eval(' { unit price ',' {03360c}')%被修改为eval ('unitprice ',' {03360n2} ')(允许两位小数)。这可以通过在数据列表的编辑项目模板中单击单价文本框的编辑数据绑定链接或直接修改声明语法来完成。之后,编辑界面的价格格式包含两个分隔符,逗号和句号。
注意:当删除货币格式时,我发现将货币符号作为文本放在文本框前面是一个很好的做法。它将提醒用户,他们不需要再输入任何货币符号。
补丁取消按钮
默认情况下,验证控件生成JavaScript在客户端执行验证。当您单击按钮、链接按钮或图像按钮时,验证控件将在页面回发之前进行检查。如果存在非法数据,则不会发生回发。但是,对于某些Button,此时不需要验证数据。在这种情况下,取消回发非常烦人。
“取消”按钮就是这种情况。想象用户输入非法数据,比如忽略产品名称,然后决定不需要保存产品,然后点击取消按钮。在这种情况下,“取消”按钮会触发验证控件,该控件报告产品名称丢失并阻止回发。我们的用户必须在产品文本框中输入一些单词,然后取消编辑。
幸运的是,Button、LinkButton和ImageButton都有CausesValidation属性,该属性可以指示在单击Button时是否需要启动验证(默认值为True)。将取消按钮的原因验证设置为假。
确保在更新命令事件处理程序中输入是合法的。
客户端脚本由验证控件生成。如果用户输入非法数据并单击“原因验证”属性为“真”的按钮,则不会导致回发。但是,如果用户使用的浏览器版本很低,或者禁用了对JavaScript的支持,则不会执行客户端身份验证。
当页面回发时,所有验证控件都会执行验证,然后将验证报告提交给页面。is有效属性。但是,整个过程不会被Page.IsValid的值打断,作为开发人员,我们需要保证Page运行时代码继续运行。是有效的。
如果禁用JavaScript的用户浏览我们的页面,编辑产品,在价格中输入“太贵”的值,然后点击“更新”按钮,将跳过客户端的身份验证,页面将继续回发。将执行UpdateCommand事件处理,然后在尝试将“太贵”的价格转换为Decimal时将引发异常。虽然已经编写了异常处理,但是我们实际上可以根据Page.IsValid的值在第一时间防止非法输入。
在UpdateCommand的开头添加以下代码:
if(!页面。IsValid)返回;完成此操作后,只有当提交的数据合法时,产品才会更新。大多数用户的非法提交都会被客户端脚本拒绝,而那些浏览器不支持JavaScript或者禁用JavaScript的客户则会跳过客户端检查,提交非法数据。
注意:细心的读者会记住,在GridView中更新数据时,我们不需要检查Page。IsValid显式。这是因为GridView已经帮助我们完成了这部分工作,也就是说,它只会在Page的时候继续更新。是有效的。
步骤3 :总结数据输入问题。
除了上述五种验证控件之外,ASP.NET还包含ValidationSummary控件,用于显示那些检查非法数据的验证控件的错误信息。这些汇总数据可以以文本或客户端消息框的形式显示。现在,让我们添加一个包含身份验证问题摘要信息的客户端消息框。
在有效摘要中拖动。因为我们将它配置为以消息框的形式显示摘要信息,所以它的位置并不重要。将“显示摘要”属性设置为“假”,将“显示消息框”属性设置为“真”。这样,所有验证错误消息将以客户端消息框的形式显示。参见图6。
图6:通过客户端消息框总结了已验证的错误信息。
摘要
在本章中,我们学习了如何使用验证控件来确保用户的输入在更新开始之前是合法的,从而减少异常的发生。ASP.NET提供了五个验证控件来检查特定控件的输入并报告其是否合法。在本章中,我们使用其中的两个——RequiredFieldValidator和CompareValidator——来确保产品名称是必需的,并且价格是大于或等于0的货币格式。
在DataList的编辑界面中添加验证控件只需要简单地将它们拖到EditItemTemplate中,然后设置几个属性。默认情况下,验证控件会自动生成客户端验证脚本,当然,它还会在回发期间提供服务器端验证,并在Page.IsValid中累积所有结果。单击Button、LinkButton或ImageButton时,可以将CausesValidation设置为False以跳过客户端验证。在执行任何代码之前,您需要确保Page。是有效的。
目前我们学习的DataList的编辑教程只是简单的界面——在TextBox中显示名称和价格。但是,编辑界面可以包含各种网络控件,如下拉列表、日历、单选按钮、复选框等。在下一章中,我们将创建一个包含各种web控件的界面。
编程快乐!
作者简介
Scott Mitchell,本系列教程的作者,也是关于ASP/ASP的六本书的作者。NET,是4GuysFromRolla.com的创始人,自1998年以来一直使用微软的网络技术。你可以点击查看所有教程《[翻译]Scott Mitchell 的ASP.NET 2.0数据教程》,希望能帮助你学习ASP.NET。