Я решил проблему. не элегантное решение, но оно работает.
сначала я поместил код в 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 сохраняет копию исходного сообщения, поэтому, если пользователь делает ошибку более одного раза, сообщение может быть получено в его первоначальной форме, в противном случае, когда мы в первый раз редактируем сообщение, мы перезаписываем заполнитель (# total # ).
DC