日期:2011-12-15  浏览次数:20476 次

客户端 API

有一个可以在客户机上使用的小型 API,以便在您自己的客户端代码中实现各种效果。因为某些例程不可能隐藏,所以理论上讲,您可以利用客户端验证脚本所定义的所有变量、特性和函数。不过,其中许多都是可以更改的实施细节。以下总结了我们鼓励您使用的客户端对象。

表 3. 客户端对象

名称 类型 说明
Page_IsValid Boolean 变量 指出页面当前是否有效。验证脚本总是保持该变量为最新。
Page_Validators 元素数组 这是包含页面上所有验证器的数组。
Page_ValidationActive Boolean 变量 指出是否应进行验证。将此变量设置为 False 可以通过编程关闭验证。
isvalid Boolean 属性 每个客户端验证器均具有该属性,指出验证器当前是否有效。请注意,在 PDC 版本中,该属性混用大小写 ("IsValid")。


绕过客户端验证

您经常需要执行的一项任务是在页面上添加“取消”按钮或导航按钮。在这种情况下,即使页面上有错误,您可能也希望使用该按钮提交页面。因为客户端按钮 "onclick" 事件在表单的 "onsubmit" 事件之前发生,因此可能会避免提交检查,并绕过验证。以下说明如何使用 HTML Image 控件作为“取消”按钮完成该任务:

<input type=image runat=server
   value="取消"
   onclick="Page_ValidationActive=false;"  
   OnServerClick=cmdCancel_Click >

使用 Button 或 ImageButton 控件执行该任务会出现一些混淆,因为 "onclick" 事件假定为同名的服务器端事件。您应在客户端脚本中设置该事件:

<asp:ImageButton runat=server id=cmdImgCancel
AlternateText="取消"
OnClick=cmdCancel_Click/>

<script language="javascript">
document.all["cmdImgCancel "].onclick =
           new Function("Page_ValidationActive=false;");
</script>

解决该问题的另一种方法是:对“取消”按钮进行一定的设置,使其在返回时不会触发客户端脚本中的提交事件。HtmlInputButton 和 LinkButton 控件就是这样的例子。

特殊效果

另一种常见的要求是:在出错时,除了由验证器自身显示的错误信息外,还需要其它一些效果。在这种情况下,您所作的任何修改均需在服务器或客户机上同时进行。假设您需要加入一个 Label,根据输入是否有效来更改颜色。以下是如何在服务器上实现该任务:

public class ChangeColorPage : Page {
    public Label lblZip;
    public RegularExpressionValidator valZip;
    
    protected override void OnLoad(EventArgs e) {            
        lblZip.ForeColor = valZip.IsValid? Color.Black : Color.Red;
    }               
}

上述方法一切都很完美,但是,只要您如上所述修改验证,就会发现除非您在客户机上进行了相同的操作,否则看起来会非常不一致。验证框架会使您避免许多这种双重效果,但是无法避免您必须在客户机和服务器上同时实现的其它效果。以下是在客户机上执行同一任务的片段:

<asp:Label id=lblZip runat=server
   Text="Zip Code:"/>
<asp:TextBox id=txtZip runat=server
   OnChange="txtZipOnChange();" /></asp:TextBox><br>
<asp:RegularExpressionValidator id=valZip runat=server
   ControlToValidate=txtZip
   ErrorMessage="无效的邮政编码"
   ValidationExpression="[0-9]{5}" /><br>

<script language=javascript>
function txtZipOnChange() {
   //如果客户端验证未处于活动状态,则不执行任何操作
   if (typeof(Page_Validators) == "undefined")  return;
   //更改标签的颜色
   lblZip.style.color = valZip.isvalid ? "Black" : "Red";
}
</script>

Beta 1 客户端 API

对于 Beta 1 版,一些可以从客户端脚本调用的函数会造成其它一些情况。

表 4. 从客户端脚本调用的函数

名称 说明
ValidatorValidate(val) 将某个客户端验证器作为输入。使验证器检查其输入并更新其显示。
ValidatorEnable(val, enable) 获取一个客户端验证器和一个 Boolean 值。启用或禁用客户端验证器。如果禁用,将不会评估客户端验证器,客户端验证器将总是显示为有效。
ValidatorHookupControl(control, val) 获取一个输入 HTML 元素和一个客户端验证器。修改或创建该元素的 change 事件,以便在更改时更新验证器。该函数适合于基于多个输入值的自定义验证器。


其特殊用途是启用或禁用验证器。如果您希望验证只是在特定的情况下生效,可能需要在服务器和客户机上同时更改激活状态,否则,您会发现用户无法提交该页面。

以下是上面的示例加上一个字段,该字段只在取消选中某个复选框时才会进行验证。

    public class Conditional : Page {
        public HtmlInputCheckBox chkSameAs;
        public RequiredFieldValidator rfvalShipAddress;