我解决了这个问题。不是一个优雅的解决方案,但它的作品
首先我把代码放到一个div
<div align="right"><asp:CustomValidator ID="RowValidator" runat="server"
ErrorMessage="Total of #total# does not equal 1st Preference + Ticket"
ControlToValidate="Total" ValidateEmptyText="True"
ClientValidationFunction="CheckRow" SetFocusOnError="True" EnableClientScript="True"
enableViewState="False" Display="Dynamic"></asp:CustomValidator></div>
然后我创建了一个JavaScript函数在页面上...
function CheckRow(sender,args) {
// get the name of the control to validate
try {
args.IsValid = true;
ctv = sender.controltovalidate;
// get the data from the other controls
nt = document.getElementById(ctv.replace('_Total','_NonTicket'));
t = document.getElementById(ctv.replace('_Total','_Ticket'));
if (nt && t) {
v1 = Number(nt.value);
v2 = Number(t.value);
v3 = Number(args.Value);
if ((v1 + v2) != v3){
msg = GetMessage(sender);
sender.innerHTML = msg.replace("#total#",Number(args.Value));
args.IsValid = false;
return false;
}
}
}
catch (e) {
// something wrong default to server side validation
}
return true;
}
这是因为我用每行自定义验证称为发送者的controltovalidate参数得到名称
然后它的一些字符串操作的问题来获取其他字段的名称。
一旦检索,你可以做你喜欢的,在我的情况下,我添加和比较。如果出现错误,Isvalid标志被清除,并且消息被修改以适应。
是必需的GetMessage函数,因为我改变了消息,所以如果用户出错不止一次的消息更给一个更有意义的错误消息
/*
get the error message from the validator
store it so it can be retrieved again
this is done because the message is altered
*/
function GetMessage(sender){
msg = window[sender.id+"_msg"];
if (!msg){
msg = sender.innerHTML;
window[sender.id+"_msg"] = msg;
}
return msg;
}
的GetMessage函数保持了原始邮件的副本可以以其原始形式进行检索,其他方式我们首次编辑消息时会覆盖占位符(#总共#)。
DC