0

J'utilise BeginCollectionItem et j'essaie de comprendre comment obtenir que chaque valeur de collection individuelle fasse une logique show/hide conditionnelle. Par exemple, si je le balisage de rasoir suivant:Afficher/Masquer la logique avec BeginCollectionItem

<div class="collection"> 
    @using (Html.BeginCollectionItem(nameof(Item))) 
    { 
     <select class="select-class" id="select-id" asp-for="SelectExample"> 
      <option value="a">a</option> 
      <option value="b">b</option> 
     </select> 

     <div class="show-if-b">b is selected</div> 
    } 
</div> 

je dois montrer le « show-if-b » div si l'élément « b » est sélectionné, sinon il doit se cacher. Cette logique doit exécuter le changement de la sélection et lorsque la page se charge ("b" pourrait être sauvegardé) donc je n'ai pas toujours un événement à attacher.

J'ai essayé différentes approches avec jQuery .closest(), .find() et .parents() mais je n'arrive pas à obtenir la valeur de sélection spécifique dans chaque collection.

Toute aide est grandement appréciée.

+1

Pour le côté client, '$ ('select-class'). Change (function() {$ (this) .next ('. Show-if-b'). Show();});' et pour le serveur côté, vous pouvez toujours vérifier la valeur de la propriété du modèle (mais votre sélection n'a même pas un attribut 'name' et ne se liera à rien, donc ce n'est pas vraiment Désolé ce que vous faites) –

+0

@StephenMuecke Désolé, j'utilise ASP.NET Core et je n'ai pas inclus ma balise 'asp-for' sur mon select qui génère un' nom'. J'ai édité mon exemple pour l'inclure. Je veux écrire une logique JavaScript côté client qui vérifie la valeur de select et affiche la div 'show-if-b' quand la sélection est b. J'ai besoin que cette logique s'exécute chaque fois que la sélection est changée et quand la page se charge. Mon problème est que cela fonctionne avec BeginCollectionItem. –

+0

@StephenMuecke Je pense que je pourrais utiliser .closest() onchange de la sélection, mais je ne pense pas que cela fonctionnera sur le chargement de la page, car je ne sais pas comment spécifier chaque collection individuelle pour exécuter la logique. –

Répondre

1

Vous pouvez utiliser $(this).next() dans on("change") pour sélectionner chaque élément div qui a "b is selected". Je n'ai pas défini ces éléments par défaut, mais vous pouvez modifier cette propriété CSS en fonction de la valeur initiale de votre modèle. Vous pouvez mettre en œuvre comme suit.

$(".collection .select-class").on("change", function(){ 
 
    var val = $(this).val(); 
 
    if(val == "a") 
 
    { 
 
     $(this).next().hide(); 
 
    } 
 
    else 
 
    { 
 
     $(this).next().show(); 
 
    } 
 
     
 
     
 
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="collection"> 
 
    <table> 
 
     <tr> 
 
      <select style="float:left" class="select-class" id="select-id" asp-for="SelectExample"> 
 
      <option value="a">a</option> 
 
      <option value="b">b</option> 
 
     </select> 
 
     <div class="show-if-b" style="display:none">b is selected</div> 
 
     </tr> 
 
     <tr> 
 
      <select style="float:left" class="select-class" id="select-id" asp-for="SelectExample"> 
 
      <option value="a">a</option> 
 
      <option value="b">b</option> 
 
     </select> 
 
     <div class="show-if-b" style="display:none">b is selected</div> 
 
     </tr> 
 
     <tr> 
 
      <select style="float:left" class="select-class" id="select-id" asp-for="SelectExample"> 
 
      <option value="a">a</option> 
 
      <option value="b">b</option> 
 
     </select> 
 
     <div class="show-if-b" style="display:none">b is selected</div> 
 
     </tr> 
 
    </table>  
 
</div>

0

Ajouter "Effondrement" classe à la div et essayez d'utiliser le ci-dessous css et javascript code (Ceci cacher et réafficher la div en fonction de la valeur sélectionnée): HTML:

<div class="show-if-b collapsed">b is selected</div> 

CSS:

.collapsed{ 
     display : none; 
    } 

Javascript:

$(document).on("change","#select-id",function(){ 
    if($(this).val() == "b"){ 
     $(".show-if-b").removeClass("collapsed"); 
    } 
    else{ 
     $(".show-if-b").addClass("collapsed"); 
    } 
}); 

Si vous voulez l'option "b" pour être Selec ted à la page ci-dessous le code charge l'utilisation et

$(document).ready(function(){ 
      $("#select-id").val("b"); 
      $(".show-if-b").removeClass("collapsed"); 
     }); 
+0

Merci pour la réponse mais je ne pense pas que votre exemple fonctionnera pour BeginCollectionItem qui crée plusieurs "répétitions" de chaque id et div. Je ne veux pas non plus sélectionner "b" lors du chargement de la page. J'ai seulement besoin d'afficher la div 'show-if-b' si" b "est sélectionné dans sa collection respective. –

0

Bien que @ dessus de la réponse de user8175473 fonctionnera, je trouve que je peux aussi utiliser les fonctions de .each() et .Find() jQuery à boucle à travers chaque collection:

$(".collection").each(function (index) 
{ 
    if ($(this).find("#select-id").val() === "b") 
    { 
     $(this).find(".show-if-b").show(); 
    } 
    else 
    { 
     $(this).find(".show-if-b").hide(); 
    } 
}); 
+0

Pourquoi n'avez-vous pas utilisé jquery en cas de changement? – hasan

+0

@ user8175473 J'utilise au changement. Mon exemple ci-dessus est plus d'une alternative à l'utilisation d'une valeur de modèle pour montrer/cacher sur la charge. –

+0

Je vois, oui vous avez raison. Chaque moyen est de faire de votre div chaque caché ou visible selon la condition. – hasan