私はまったく同じ問題を抱えていました。CompareValidatorの代わりにCustomValidatorを使用してください。(CustomValidatorにはValidateEmptyTextという便利な属性がありますが、少なくともASP.NET 2.0ではCompareValidatorにはありません。)
適切なServerValidate関数とClientValidationFunctionをプログラムする必要があります。javascript関数の関数シグネチャは、基本的にServerValidate関数の場合と同じです:source(object)、args(ServerValidateEventArgs)。
最も難しい部分は、「CompareTo」テキストボックスにアクセスするためのカスタムコードを作成する必要があることです。これは、CustomValidatorの一部ではないためです。私のフィールドはFormView内にありました。特定の状況に合わせてコードを調整する必要がある場合があります。以下のコードでは、「fv」はそのFormViewの名前です。
クライアント側の検証:
<script type="text/javascript">
<!--
function cvPasswordRpt_Validate(source, args)
{
args.IsValid = (args.Value ==
document.getElementsByName("fv$tbPassword").item(0).value);
}
//-->
</script>
ASPXコード:
<label>New Password:</label>
<asp:TextBox ID="tbPassword" runat="server" CssClass="stdTextField"
TextMode="Password" ValidationGroup="edit" />
<br />
<label>Repeat New Password:</label>
<asp:TextBox ID="tbPasswordRpt" runat="server" CssClass="stdTextField"
TextMode="Password" ValidationGroup="edit" />
<asp:CustomValidator ID="cvPasswordRpt" runat="server" Display="Dynamic"
EnableClientScript="true" ValidationGroup="edit"
ControlToValidate="tbPasswordRpt" ValidateEmptyText="true"
ErrorMessage="Your passwords do not match."
ClientValidationFunction="cvPasswordRpt_Validate"
OnServerValidate="cvPasswordRpt_ServerValidate" />
サーバー側の検証(VB.NET):
Protected Sub cvPasswordRpt_ServerValidate(ByVal sender As Object,
ByVal e As ServerValidateEventArgs)
Dim _newPassword As String = DirectCast(fv.FindControl("tbPassword"),
TextBox).Text
e.IsValid = e.Value.Equals(_newPassword)
End Sub