Bonjour,
j'ai développé un formulaire dans lequel l'utilisateur sélectionne d'abord un continent dans un DropDownList. Une fois le continent sélectionné, les pays correspondant sont chargés en base et affichés dans un second DropDownList.
Comment puis-je récupérer l'objet bindé que l'utilisateur a sélectionné dans le DropDownList ?
Tout d'abord, je possède une classe AtlasVM exposant une propriété pour l'identifiant du continent sélectionné, une autre pour l'identifiant du pays sélectionné et les 2 listes de continents et de pays.
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public class AtlasVM { [Display(Description="Continent:")] public int? SelectedContinentId { get; set; } [Display(Description = "Pays:")] public int? SelectedCountryId { get; set; } public IEnumerable<Continent> Continents { get; set; } public IEnumerable<Country> Countries { get; set; } }
Le code du formulaire est le suivant:
Code asp.net : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 <fieldset> <legend>Atlas</legend> <% using (Html.BeginForm()) %> <% { %> <div> <label> Continent</label> <%= Html.DropDownListFor(m => m.SelectedContinentId, new SelectList(Model.Continents, "Id", "Name"), "[Sélectionnez un continent]")%> </div> <div> <label> Pays</label> <%= Html.DropDownListFor(m => m.SelectedCountryId, new SelectList(Model.Countries, "Id", "Name"), "[Sélectionnez un pays]") %> </div> <input type="submit" value="Select" /> <% } %> </fieldset>
Je charge les continents dans l'action:
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public ActionResult Index() { AtlasVM a = new AtlasVM(); a.Continents = ContinentRepository.Default.GetContinents(); a.Countries = new List<Country>(); return View(a); }
Enfin, j'utilise jQuery pour détecter une sélection du continent et charger les pays correspondants:
Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 <script type="text/javascript"> $(document).ready(function () { $("#SelectedContinentId").change(function () { var url = '<%= Url.Content("~/") %>' + "Home/SelectContinent"; var ddlsource = "#SelectedContinentId"; var ddltarget = "#SelectedCountryId"; $.getJSON(url, { selectedContinent: $(ddlsource).val() }, function (data) { $(ddltarget).empty(); $(ddltarget).append("<option value=''>[Sélectionnez un pays]</option>"); $.each(data, function (index, optionData) { $(ddltarget).append("<option value='" + optionData.Id + "'>" + optionData.Name + "</option>"); }); }); }); }); </script>
Donc sur sélection du continent, l'action SelectContinent du contrôleur est appelée:
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 public JsonResult SelectContinent(int selectedContinent) { JsonResult result = new JsonResult(); result.JsonRequestBehavior = JsonRequestBehavior.AllowGet; result.Data = CountryRepository.Default.GetCountries(selectedContinent); return result; }
Et enfin sur validation du formulaire,
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 [AcceptVerbs(HttpVerbs.Post)] public ActionResult Index(AtlasVM c) { Atlas a = new Atlas(); a.SelectedContinent = c.Continents.FirstOrDefault(cont => cont.Id == c.SelectedContinentId); a.SelectedCountry = c.Countries.FirstOrDefault(count => count.Id == c.SelectedCountryId); AtlasRepository.Default.Save(a); return View("Valid"); }
Comment puis-je procéder svp ?
Merci d'avance,
Etienne
Partager