У меня была точно такая же проблема. Используйте CustomValidator вместо CompareValidator. (У CustomValidator есть полезный атрибут ValidateEmptyText, которого нет в CompareValidator, по крайней мере, в ASP.NET 2.0.)
Вам потребуется запрограммировать соответствующую функцию ServerValidate, а также функцию ClientValidationFunction. Подпись функции для функции javascript в основном такая же, как и для функции ServerValidate: источник (объект), аргументы (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