Remplir DropDownList à partir d’une autre DropDownList

J’ai deux modèles liés.

public partial class bs_delivery_type { public decimal delivery_id { get; set; } public decimal delivery_city_id { get; set; } public ssortingng delivery_address { get; set; } public virtual bs_cities bs_cities { get; set; } } 

et le second:

 public partial class bs_cities { public bs_cities() { this.bs_delivery_type = new HashSet(); } public decimal cities_id { get; set; } public ssortingng cities_name { get; set; } public virtual ICollection bs_delivery_type { get; set; } } 

et j’ai de tels ViewBag pour dropdownlist:

 ViewBag.city = new SelectList(_db.bs_cities, "cities_id", "cities_id"); ViewBag.delivery_adress = new SelectList(_db.bs_cities, "delivery_id", "delivery_address"); 

Lorsque je choisis la city dans la première liste déroulante, dans la seconde, il doit apparaître une liste liée à delivery_adress , où delivery_city_id = cities_id (de la première liste déroulante).

Comment faire ça?

Edit: J’ai essayé la méthode du commentaire de @ Izzy, voici donc ma vue actuelle:

 @model Bike_Store.Models.DeliveryModel @{ ViewBag.Title = "Checkout"; }     function GetDelivery(_stateId) { var procemessage = " Please wait..."; $("#ddldelivery").html(procemessage).show(); var url = "/Shop/GetDeliveryByCityId/"; $.ajax({ url: url, data: { cities_id: _stateId }, cache: false, type: "POST", success: function (data) { var markup = "Select adress"; for (var x = 0; x < data.length; x++) { markup += "" + data[x].Text + ""; } $("#ddldelivery").html(markup).show(); }, error: function (reponse) { alert("error : " + reponse); } }); }  

Checkout

@using (Html.BeginForm()) { @Html.DropDownListFor(m=>m.CitiesModel, new SelectList(Model.CitiesModel, "cities_id", "cities_name"), new {@id = "ddldelivery", @style="width:200px", @onchange="javascript:GetDelivery(this.value);"})



}

Mon contrôleur ressemble maintenant à ceci:

 public List GetAllCities() { List cities = new List(); foreach (var city in _db.bs_cities) { cities.Add(city); } return cities; } public List GetAllDeliveries() { List deliveries = new List(); foreach (var delivery in _db.bs_delivery_type) { deliveries.Add(delivery); } return deliveries; } [HttpPost] public ActionResult GetDeliveryByCityId(decimal cities_id) { List delivery = new List(); delivery = GetAllDeliveries().Where(m => m.delivery_city_id == cities_id).ToList(); SelectList objDelivery = new SelectList(delivery, "delivery_id", "delivery_address", 0); return Json(objDelivery); } public ViewResult Checkout() { DeliveryModel deliveryModel = new DeliveryModel(); deliveryModel.CitiesModel = new List(); deliveryModel.CitiesModel = GetAllCities(); return View(deliveryModel); } 

Le problème maintenant est que j’ai 2 ddls, mais ne fonctionne que le premier. Dans scrshot, vous pouvez voir que j’ai une liste de villes, lorsque je choisis une ville, dans ce même ddl, apparaît une liste d’adresses de livraison et lorsque je choisis une adresse, elle disparaît. Quelle magie? Aidez-moi s’il vous plaît avec Ajax. Liste des villes liste des villes liste d'adresses entrez la description de l'image ici

Je pense que je l’ai corrigé, le problème était dans:

 @Html.DropDownListFor(m=>m.CitiesModel, new SelectList(Model.CitiesModel, "cities_id", "cities_name"), new {@id = "ddldelivery", @style="width:200px", @onchange="javascript:GetDelivery(this.value);"}) 

Je change @id = "ddldelivery" en @id = "ddlcity" et cela fonctionne maintenant

Le guide suivant vous montrera:

  • Créer une vue partielle
  • Prend cityid en entrée et affiche la liste d’adresses de livraison
  • Charger la vue partielle dans votre sélection

Remarque: La solution de la vue partielle peut être excessive dans cette situation, mais pour des problèmes similaires, elle est en fait très utile.

PartialView .cshtml

Nom de fichier: _deliveryTypePartial.cshtml

 @model List @foreach(var item in Model) {  } 

Code du contrôleur pour la vue partielle:

 public IActionResult _deliveryTypePartial(decimal city_id) { List model = context.bs_delivery_types.Where(row => row.delivery_city_id == delivery_city_id).ToList(); return PartialView(model); } 

Et puis enfin, pour votre AJAX

Je remarque que vos deux listes déroulantes ont des identifiants identiques, ce qui va embrouiller votre code javascript et est considéré comme une mauvaise pratique. Par conséquent, pour les besoins de ce guide, nous appellerons la première liste déroulante:

ddlcity

Maintenant, dans votre fonction onchange pour ddlcity :

 $('#ddldelivery').load("/ControllerName/_deliveryTypePartial?city_id=" _stateId); 

Cela devrait charger la vue partielle dans votre deuxième liste déroulante.

PS : Après avoir répondu à cette question, vous avez déjà utilisé la méthode directe ajax. Je conviens que les deux méthodes conviennent également dans ce cas. Vous pouvez peut-être utiliser la méthode décrite ici si les objects que vous devez renseigner sont beaucoup plus complexes.