ASP.NET 服务器控件的验证

来源:百度文库 编辑:神马文学网 时间:2024/05/23 16:41:23
1. ASP.NET 服务器控件的客户端验证
如果用户使用的浏览器支持动态 HTML (DHTML),则 ASP.NET 验证控件可以使用客户端脚本来执行验证。因为这种控件可以提供及时反馈(无需到服务器的往返过程),所以用户会感觉到页的性能有所改善。
在大多数情况下,无需对页或验证控件作出任何更改便可使用客户端验证。控件将自动检测浏览器是否支持 DHTML 并执行相应的检查。客户端验证使用的错误显示机制和服务器端验证相同。
安全注意 即使已经在客户端上执行了验证,也必须在服务器上执行验证。这允许您通过服务器代码来确定验证状态,并且避免用户避开验证,从而提供了更高的安全性。
客户端验证的差异如果是在客户端上执行验证,则验证控件可以包括某些附加功能:
  • 如果打算生成验证错误信息摘要,您可以在消息框中显示这些信息,该框在用户提交页时出现。有关详细信息,请参见如何:控制 ASP.NET 服务器控件的验证错误信息显示

  • 验证控件的对象模型在客户端略有不同。请参见本主题中后面的客户端验证对象模型
      客户端验证具有以下几个细微不同之处:
      • 如果启用客户端验证,则页将包含对执行客户端验证所用的脚本库的引用。

    • 使用 RegularExpressionValidator 控件时,如果可以使用兼容 ECMAScript 的语言(例如 Microsoft JScript),则可以在客户端检查表达式。客户端正则表达式检查与在服务器上使用 Regex 类进行的正则表达式检查相比,两者的差异非常小。
    • 页中包含客户端方法,以便在页提交前截获并处理 Click 事件。
        客户端验证对象模型验证控件在客户端上呈现的对象模型与在服务器上呈现的对象模型几乎完全相同。例如,无论在客户端上还是在服务器上,您都可以通过相同的方式读取验证控件的 IsValid 属性以测试验证。
        但是,在页级别上公开的验证信息有所不同。在服务器上,页支持属性;在客户端,它包含全局变量。下表比较了在页上公开的信息。

        客户端页变量 服务器页属性 Page_IsValid
        IsValid
        Page_Validators(数组)   包含对页上所有验证控件的引用。
        Validators(集合)   包含对所有验证控件的引用。
        Page_ValidationActive   表示是否应进行验证的布尔值。通过编程方式将此变量设置为 false 以关闭客户端验证。
        (无等效项)
        注意 所有与页相关的验证信息都应被视为只读信息。
        发送具有客户端验证错误的页在某些情况下,您可能不愿意使用客户端验证而愿意仅使用服务器端验证,即使是可以使用客户端验证亦如此。例如,如果验证需要使用只有服务器才有的信息或资源(例如访问数据库),则客户端验证不可行。
        默认情况下,在执行客户端验证时,如果页上出错,则用户无法将页发送到服务器。但您可能发现有必要允许用户即使在出错时也可以发送。例如,页上可能有一个取消按钮或一个导航按钮,您需要该按钮即使在部分控件未通过验证的情况下也提交页。

        2. 禁用 ASP.NET 服务器控件验证
        在特定条件下,您可能需要避开验证。例如,您可能具有一个页面,即使用户没有正确填写所有验证字段,也应该可以发送页。您可以设置 ASP.NET 服务器控件来避开客户端和服务器的验证,而不只是客户端验证。
        安全注意 默认情况下,ASP.NET 网页执行请求验证以确保用户输入内容不包含脚本或 HTML 元素。可以显式禁用该功能。有关更多信息,请参见脚本侵入
        您还可以禁用验证控件,以使它根本不在页面上呈现并且不进行使用该控件的验证。
        如果要执行服务器上的验证,不执行客户机上的验证,您可以将单独验证控件设置为不生成客户端脚本。如果客户端上的动态更新导致页的布局出现问题,或者如果要在验证之前执行一些服务器代码,这一措施将尤为有用。
        在特定控件中禁用验证
        • 将该控件的 CausesValidation 属性设置为 false

        下面的示例显示如何创建“取消”按钮,以便避开验证检查:

        C#
        复制代码
          禁用验证控件
          • 将验证控件的 Enabled 属性设置为 false

            禁用客户端验证
            • 将验证控件的 EnableClientScript 属性设置为 false

              3. 以编程方式测试 ASP.NET 服务器控件的有效性
              验证控件测试用户输入,设置错误状态,并生成错误信息。它们不会更改页的处理流程,例如,在检测到用户输入错误时不会略过代码。取而代之的是,您将在执行应用程序的特定逻辑之前在代码中测试控件的状态。如果检测到错误,您自己的代码将无法运行;页将继续处理并返回给用户,并向其显示错误信息。
              安全注意 默认情况下,ASP.NET 网页自动验证是否有恶意用户试图向您的应用程序发送脚本或 HTML 元素。有关更多信息,请参见脚本侵入概述
              您可以测试常规的页范围的状态,并且可以测试单独控件的状态。通常,您在为页创建的事件处理程序中完成上述工作。
              测试常规错误状态
              • 在您的代码中,测试页的 IsValid 属性。此属性将累计页上所有验证控件的 IsValid 属性的值(使用逻辑 AND),如果有任何验证控件设置为无效,页的属性都将返回 false。

              注意 验证信息在页的初始化或加载阶段不可用。但是,您可以在 Page_Load 期间手动调用 Validate 方法,然后测试页的 IsValid 属性。有关页状态的详细信息,请参见 ASP.NET 页生命周期概述
              下面的代码示例演示按钮的事件处理程序。该代码测试页的 IsValid 属性。请注意,在此无需其他子句,原因是页将自动返回到浏览器,并且验证控件将显示其自己的错误信息。

              C#
              复制代码void Button1_Click(object sender, System.EventArgs e){    if (IsValid)    {        // Perform database updates or other logic here.    }}
                测试单独控件的错误状态
                • 依次通过页的 Validators 集合,该集合包含对于所有验证控件的引用。您可以随后检查每个验证控件的 IsValid 属性。

                注意 如果希望在 Page_Load 期间执行该检查,则必须首先手动调用 Validate 方法。
                下面的代码示例演示如何获取单个验证控件的状态。
                Visual Basic

                复制代码If (Me.IsPostBack) Then    Me.Validate()    If (Not Me.IsValid) Then        Dim msg As String        ' Loop through all validation controls to see which         ' generated the error(s).        Dim oValidator As IValidator        For Each oValidator In Validators            If oValidator.IsValid = False Then                msg = msg & "
                " & oValidator.ErrorMessage            End If        Next        Label1.Text = msg    End IfEnd If
                C#

                复制代码if (this.IsPostBack){    this.Validate();    if (!this.IsValid)    {        string msg = "";        // Loop through all validation controls to see which        // generated the errors.        foreach (IValidator aValidator in this.Validators)        {            if (!aValidator.IsValid)            {                msg += "
                " + aValidator.ErrorMessage;            }        }        Label1.Text = msg;    }}