Comment créer une liste de sélection en cascade dans ASP.Net Core MVC

Je travaillais dans une application différente avec les mêmes valeurs de modèle, mais j’ai rencontré un problème cette fois-ci.

Ce que je veux réaliser, c’est que lorsque je sélectionne une valeur dans une SelectList , les valeurs d’une autre sont modifiées. Ceci ne fonctionne pas actuellement.

Disons que j’ai le modèle suivant:

 public class DashboardChartsByMonthModel { ... public SelectList TimeSliceList { get; set; } public TimeSlice TimeSliceVal { get; set; } // Timeslice is an Enum containing "ByMonth" and "ByQuarter" public SelectList StartQuarterList { get; set; } public ssortingng StartQuarter { get; set; } public SelectList StartMonthList { get; set; } public ssortingng StartMonth { get; set; } public SelectList StartYearList { get; set; } public ssortingng StartYear { get; set; } .... public void SetDefaults() { ... TimeSliceList = new SelectList(new List { new SelectListItem {Selected = true, Text = "Monthly", Value = TimeSlice.ByMonth.ToSsortingng()}, new SelectListItem {Selected = false, Text = "Quarterly", Value = TimeSlice.ByQuarter.ToSsortingng()} }, "Value", "Text"); } StartQuarterList = new SelectList(new List { new SelectListItem {Selected = true, Text = "Q1", Value = "1"}, new SelectListItem {Selected = false, Text = "Q2", Value = "4"}, new SelectListItem {Selected = false, Text = "Q3", Value = "7"}, new SelectListItem {Selected = false, Text = "Q4", Value = "10"} }, "Value", "Text"); StartMonthList = new SelectList(new List { new SelectListItem {Selected = true, Text = "January", Value = "1"}, new SelectListItem {Selected = false, Text = "February", Value = "2"}, new SelectListItem {Selected = false, Text = "March", Value = "3"}, new SelectListItem {Selected = false, Text = "April", Value = "4"}, new SelectListItem {Selected = false, Text = "May", Value = "5"}, new SelectListItem {Selected = false, Text = "June", Value = "6"}, new SelectListItem {Selected = false, Text = "July", Value = "7"}, new SelectListItem {Selected = false, Text = "August", Value = "8"}, new SelectListItem {Selected = false, Text = "September", Value = "9"}, new SelectListItem {Selected = false, Text = "October", Value = "10"}, new SelectListItem {Selected = false, Text = "November", Value = "11"}, new SelectListItem {Selected = false, Text = "December", Value = "12"} }, "Value", "Text"); StartYearList = new SelectList(new List { new SelectListItem {Selected = false, Text = "2016", Value = "2016"}, new SelectListItem {Selected = true, Text = "2017", Value = "2017"} }, "Value", "Text"); 

Et à mon avis, une page Razor (.cshtml) présente les éléments suivants:

  .... 

By Month or Quarter

Start: ....

Existe-t-il un moyen de l’avoir de sorte que si la valeur de la première liste de sélection soit Mensuelle, les valeurs de la liste de mois soient affichées, et inversement, de sorte que lorsque la première zone est modifiée, la deuxième zone change également?

J’ai pu résoudre ce problème dans l’une de mes autres applications, mais la procédure était très lourde et dépendait du fait que les deux listes SelectLists accédaient à la même propriété de modèle. J’imagine qu’il doit y avoir une meilleure façon de faire cela.

Cela devrait être assez simple à faire via javascript. Mon approche utilisera JQuery. Si vous n’utilisez pas JQuery, des ressources sont disponibles pour vous aider à le convertir en code javascript natif.

 $(document).ready(function() { $("#TimeSlice").on("change", function() { var selectedValue = $(this).val(); if(val === "Whatever the value of Monthly is here") { $("#StartMonth").show(); $("#StartYear").hide(); } else if(val === "Whatever the value of Quarterly is here"){ $("#StartYear").show(); $("#StartMonth").hide(); }else{ //If you have any other options in the dropdown, such as a default value or placeholder, this will hide both quarterly and monthly $("#StartYear").hide(); $("#StartMonth").hide(); } } }); 

Il n’y a rien de compliqué à faire. Tout ce que vous faites est tout d’abord, restituer le premier menu déroulant et écouter l’événement de modification de celui-ci, puis lire la valeur et émettre un appel ajax avec la valeur sélectionnée au serveur, où la liste appropriée de SelectListItems sera renvoyée pour le rendu du deuxième menu déroulant.

 public class DashboardChartsByMonthModel { public List TimeSliceList { set;get;} public int SelectedTimeSlice { set;get;} public List TimeOptions{ set;get;} public int SelectedTimeOption { set;get;} } 

dans votre action GET, vous chargez les premières données de liste déroulante

 public IActionResult Create() { var vm= new DashboardChartsByMonthModel(); vm.TimeSliceList = new List { new SelectListItem {Selected = true, Text = "Monthly", Value = TimeSlice.ByMonth.ToSsortingng()}, new SelectListItem {Selected = false, Text = "Quarterly", Value = TimeSlice.ByQuarter.ToSsortingng()} }; return View(vm); } 

et dans votre vue, utilisez l’assistant de balise SELECT

 @model DashboardChartsByMonthModel      

Le javascript pour gérer les événements de changement est assez simple avec jQuery

 $(function () { $("#SelectedTimeSlice").change(function() { var v = $(this).val(); var url = $("#SelectedTimeOption").data("url") + '?value=' + v; $.getJSON(url,function(data) { $("#SelectedTimeOption").empty(); $.each(data, function(i, item) { $("#SelectedTimeOption") .append($(" 

Cela suppose que vous disposez d’une méthode d’action qui accepte la valeur d’option sélectionnée du premier menu déroulant et renvoie les options nécessaires pour le second.

 public IActionResult GetTimes(ssortingng value) { if (value == TimeSlice.ByMonth.ToSsortingng()) { var l = new List { new SelectListItem {Selected = true, Text = "January", Value = "1"}, new SelectListItem {Selected = false, Text = "February", Value = "2"} }; return Json(l); } var t2 = new List { new SelectListItem {Selected = true, Text = "Q1", Value = "1"}, new SelectListItem {Selected = false, Text = "Q2", Value = "2"} }; return Json(t2); } 

La chose importante à noter est que, dans le kernel asp.net, le code JSON renvoyé est une affaire de chameau. Donc, pour chaque option de sélection, il s’agit du text et de la value au lieu de Text et de la Value