2017-09-11 1 views
12

J'essaie d'implémenter un validateur personnalisé en JavaScript pour ma page vb.net. Ce validateur doit vérifier si dans une liste déroulante multichoix il n'y a pas de valeurs sélectionnées, montrant une erreur si c'est le cas. La chose est, je veux le faire côté client, mais dans ma fonction 'validateFunction' je reçois seulement le dernier élément sélectionné (ou non sélectionné, s'il a déjà été sélectionné). Je sais comment le faire en code-behind, mais je veux le faire côté client.obtenir toutes les valeurs sélectionnées de ListBox (côté client)

Code ASPX:

<asp:ListBox ID="lbEdit" runat="server" SelectionMode="Multiple"> 
</asp:ListBox> 
<asp:CustomValidator id="cvEdit" runat="server" Display="None" ControlToValidate="lbEdit" ClientValidationFunction="validateFunction"/> 
<ajax:ValidatorCalloutExtender runat="server" ID="vceEdit" TargetControlID="cvEdit" /> 

code JavaScript:

function validateFunction(source, arguments) { 
     var options = document.getElementById(source.controltovalidate).options; 
      for (var i = 0; i < options.length; i++) { 
       if (options[i].selected == true) { 
        args.IsValid = true; 
        return; 
       } 
      } 
      args.IsValid = false; 
} 

Comme je l'ai dit, depuis la dernière (un) élément sélectionné sera le seul sélectionné dans les 'options' tableau, la fonction validation retourne toujours vrai ...

je pensais à une autre peuplant ARRA y dans une autre fonction javascript en tant que «vrai tableau sélectionné» et comparez ses valeurs avec l'option sélectionnée chaque fois que la fonction se déclenche .. mais je pense qu'il devrait y avoir un meilleur moyen.

Alors ... Y at-il une voie à suivre tout droit d'obtenir tous les éléments sélectionnés dans une zone de liste de MultiChoice en javascript?

Répondre

1
let a1 = [ 
{ 
    Selected:false, 
}, 
{ 
    Selected:false 
}, 
{ 
    Selected:false 
}]; 

if (a1.some (i => i.Selected)) console.log (true); sinon console.log (false);

Peut-être ce que vous voulez

4

Votre question est un peu floue, et votre fonction semble fonctionner, mais ce que je vais répondre ici est la dernière partie de votre question Alors ... Y at-il une voie à suivre directement à obtenir TOUS les éléments sélectionnés d'une liste déroulante multichoice en JavaScript?

Essayez cette js fonction

<script type="text/javascript"> 
     function validateFunction() { 
      var options = document.getElementById('<% = this.lbEdit.ClientID %>').options; 
      var selectedItems; 
      for (var i = 0; i < options.length; i++) { 
       if (options[i].selected == true) { 
        if (selectedItems) { 
         selectedItems = selectedItems + ";" + options[i].value; 
        } 
        else { 
         selectedItems = options[i].value; 
        } 
       } 
      } 
      if (selectedItems) { 
       alert(selectedItems); 
       return true; 
      } 
      else { 
       alert("No item was selected"); 
       return false; 
      } 
     } 
    </script> 

Et ceci est le code ASPX, j'ai enlevé le validateur

<asp:ListBox ID="lbEdit" runat="server" SelectionMode="Multiple" > 
</asp:ListBox> 
    <asp:Button ID="test" runat="server" Text="send" OnClientClick="return validateFunction();"/> 

Dans les outils de développement de votre navigateur, vous pouvez voir une information détaillée sur tous les les propriétés de votre objet

enter image description here

+0

Désolé pour le retard, je n'ai pas eu le temps à cause d'un projet nouveau et urgent que nous avions reçu ... encore dessus, putain ... À la réponse, dans un regard il semble que votre code fasse la même chose comme le mien, donc 'options [i] .selected == true' ne se déclencherait qu'une fois dans mon code, avec la dernière option cliquée ... Mes outils de développement ne définissent jamais plus d'un 'selected = true'. Peut-être que j'ai déclaré la liste de sélection dans le mauvais sens? J'espère avoir encore du temps lundi pour faire un autre examen et peut-être réouvrir la question. En attendant, je ne peux pas vous donner la prime, au moins un upvote pour l'effort, merci !!! –

+0

En fait, je remarque que ce serait la même chose que de vous récompenser ou non, comme je l'ai lu, alors générosité pour vous, vous l'avez mérité. De toute façon ma solution de contournement serait de créer un tableau JavaScript, et chaque fois que le listbox.selected se déclenche, basculer cet état de l'index (vrai <---> false) ... sera de retour avec des nouvelles je suppose;) –