2009-06-26 9 views
4

J'essaie de valider qu'un certain incrément d'un produit a été entré dans la zone de texte qté du produit qui se trouve dans un répéteur. Le problème est que l'incrément est différent pour chaque produit, donc j'ai besoin de cela comme variable pour chaque appel pour le valider (ce que je ne pense pas que vous pouvez faire avec un validateur personnalisé), et j'ai besoin de côté client avec un ValidatorCalloutExtender . La meilleure solution que j'ai trouvée est de déclencher un validateur RegEx qui évaluera faux via mon propre javascript (un autre validateur prend soin de s'assurer que c'est un nombre valide). Le problème est qu'avec ValidatorCalloutExtender, quand je désactive le validateur, il le marque toujours comme invalide (la zone de texte clignote en blanc puis redevient jaune (ce qui signifie invalide), même si j'ai placé des alertes JavaScript et je sais que le validateur est désactivé. ont des idées à ce qui se passe ici est ici le code MerciDésactiver le validateur mais la légende du validateur s'affiche toujours et provoque la validation

PS:.! tout fonctionne bien avec/la validatorCalloutExtender, mais je vraiment besoin

Callout Extender

les valideurs:

<asp:RegularExpressionValidator ID="ProductIncrementValidator" runat="server" 
    ControlToValidate="ProductQtyTxt" 
    ErrorMessage="Please enter a valid increment" 
    ValidationExpression="^triggerthisvalidation$" 
    Enabled="false" 
    Display="Dynamic" 
    SetFocusOnError="true" 
    ValidationGroup="productValidation"> 
</asp:RegularExpressionValidator> 

<ajax:ValidatorCalloutExtender ID="ProductIncrementVE" runat="server" 
    TargetControlID="ProductIncrementValidator" 
    HighlightCssClass="validator" 
    WarningIconImageUrl="~/img/blank.gif"> 
</ajax:ValidatorCalloutExtender> 

Lors de la liaison de données du produit:

Dim productQtyTxt As TextBox 
productQtyTxt = CType(e.Item.FindControl("ProductQtyTxt"), TextBox) 

Dim incrementValidator As RegularExpressionValidator 
incrementValidator = CType(e.Item.FindControl("ProductIncrementValidator"), RegularExpressionValidator) 
incrementValidator.ErrorMessage = "Please enter an increment of " & product.OrderIncrement.ToString() 


' Add item qty increment check 
productQtyTxt.Attributes.Add("onChange", "javascript:checkIncrement('" _ 
    & productQtyTxt.ClientID & "', " _ 
    & product.OrderIncrement & ", '" _ 
    & incrementValidator.ClientID & "')") 

Le Javascript:

function checkIncrement(textboxID, incrementQty, validatorID) { 
    var textbox = $get(textboxID); 
    var incrementValidator = $get(validatorID); 
    var qtyEntered = textbox.value; 

    if ((qtyEntered % incrementQty) != 0) { 
     ValidatorEnable(incrementValidator, true); 
     alert("not valid"); 
     return; 
    } 
    else { 
     ValidatorEnable(incrementValidator, false); 
     alert("valid"); 
     return; 
    } 
} 
+0

J'ai mis la cssclass de la zone de texte à vide dans la fonction javascript et caché la légende, maintenant cela fonctionne mais quand focus est placé sur la boîte elle appelle la validation et essaye de valider avec mon expression^triggerthisvalidation $ pour le validateur RegEx. Comment puis-je le faire ne pas déclencher la validation sur le focus? – Ryan

Répondre

0

J'ai eu le même problème, je résolus avec quelque chose comme ça

if ((qtyEntered % incrementQty) != 0) { 
    ValidatorEnable(incrementValidator, true); 
    $("#" + validatorID + "_ValidatorCalloutExtender_popupTable").show(); 
    alert("not valid"); 
    return; 
} 
else { 
    ValidatorEnable(incrementValidator, false); 
    $("#" + validatorID + "_ValidatorCalloutExtender_popupTable").hide(); 
    alert("valid"); 
    return; 
} 

Hope this helps quelqu'un.

1

1.Réglez classe CSS pour ValidatorCalloutExtender:


<style id = "style1" type="text/css"> 
     .CustomValidator 
     { 
      position: relative; 
      margin-left: -80px; 
      margin-top: 8px; 
      display: inherit; 
     } 
</style> 
 

 

<ajax:ValidatorCalloutExtender ID="ProductIncrementVE" runat="server" 
    TargetControlID="ProductIncrementValidator" 
    HighlightCssClass="validator" 
    WarningIconImageUrl="~/img/blank.gif" 
    CssClass="CustomValidator"> 
</ajax:ValidatorCalloutExtender> 

2. Utilisez JavaScript pour modifier cette classe CSS en cas de besoin. Set display = none:

 


function alterDisplay(type) { 
    var styleSheet, cssRule; 
    if (document.styleSheets) { 
     styleSheet = document.styleSheets[index1]; 
     if (styleSheet) { 
      if (styleSheet.cssRules) 
       cssRule = styleSheet.cssRules[index2]; // Firefox 
      else if (styleSheet.rules) 
       cssRule = styleSheet.rules[index2];   // IE 
      if (cssRule) { 
       cssRule.style.display = type; 
      } 

     } 
    } 
} 
 

Note: le index1 et index2 peuvent être la différence des pages, il est à votre déclaration. Vous pouvez utiliser le débogueur IE pour trouver nos index correctement.

Questions connexes