управления именами в пользовательском валидаторе .NET Client Side Validation - PullRequest
0 голосов
/ 09 февраля 2010

У меня есть сетка с тремя столбцами текстовых полей. Он может иметь столько строк, сколько необходимо, но обычно его всего около 5 строк. Каждая строка должна быть проверена.

Я хочу создать средство проверки на стороне клиента, которое суммирует 2 столбца вместе и сравнивает его с третьим столбцом, чтобы убедиться, что пользователь правильно ввел данные.

Просто на тот случай, если вам интересно, это часть спецификации, что оператор должен вводить третий столбец, а не просто суммировать два предыдущих столбца вместе в коде позади. Это сделано для того, чтобы оператор правильно расшифровал информацию.

Я пытаюсь использовать специальный валидатор в .net для создания этой валидации на стороне клиента. но я не могу найти способ передать ему имена трех текстовых полей. Я могу дать ему имя целевого элемента управления с помощью параметра ControlToValidate, но как мне передать два других идентификатора элемента управления?

Я ищу «правильный» способ сделать это, одна мысль состоит в том, чтобы создать массив в javascript, на который ссылается имя controltovalidate.

DC

1 Ответ

0 голосов
/ 10 февраля 2010

Я решил проблему. не элегантное решение, но оно работает.

сначала я поместил код в 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

...