2010-02-09 3 views
0

J'ai un gridview avec trois colonnes de zones de texte. Il peut contenir autant de lignes que nécessaire, mais il ne comporte généralement que 5 lignes. Chaque ligne doit être validée.Valeurs de contrôle dans un validateur personnalisé Validation côté client .NET

Je souhaite créer un validateur côté client qui additionne deux des colonnes et les compare avec la troisième colonne pour vérifier que l'utilisateur a saisi les données correctement. Juste au cas où vous vous demandez, cela fait partie des spécifications que l'opérateur doit entrer dans la troisième colonne plutôt que de simplement additionner les deux colonnes précédentes dans le code derrière. Ceci est fait pour s'assurer que l'opérateur est en train de transcrire l'information correctement.

J'essaie d'utiliser le validateur personnalisé dans .net pour créer cette validation côté client. mais je ne peux pas trouver un moyen de lui transmettre les noms des trois zones de texte. Je peux lui donner le nom des contrôles cibles en utilisant le paramètre ControlToValidate, mais comment passer les deux autres id de contrôle?

Je suis à la recherche de la manière 'correcte' de faire cela, une pensée est de créer un tableau en javascript référencé par le nom de controltovalidate.

DC

Répondre

0

J'ai résolu le problème. pas une solution élégante mais cela fonctionne.

d'abord je placé le code dans un div sur la page

<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> 

Puis j'ai créé une fonction 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; 
} 

Ceci est appelé par le validateur personnalisé pour chaque ligne que j'utilise le paramètre controltovalidate de l'expéditeur pour obtenir le nom

puis c'est une question d'un peu de manipulation de chaîne pour obtenir les noms des autres champs.

Une fois récupéré, vous pouvez faire ce que vous voulez, dans mon cas, j'ajoute et compare. S'il y a une erreur, le drapeau Isvalid est effacé et le message est modifié pour convenir.

La fonction getMessage est nécessaire parce que je modifie le message pour donner un message d'erreur plus significatif

/* 
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; 
} 

La fonction getMessage conserve une copie du message d'origine si l'utilisateur fait une erreur plus d'une fois le message peut être récupéré dans sa forme vierge, sinon la première fois que nous éditons un message, nous écrasons l'espace réservé (# total #).

DC

Questions connexes