Bu makalemizde tüm programlama dillerinde en sık olarak kullanılan iç içe(cascading) dropdownlist’leri oluşturmayı göreceğiz.
MVC ile İç İçe(Cascading) Dropdownlist’ler oluşturma
Bu makalemizde örneğimizin daha uzun olmaması adına bir veritabanı yerine sanal olarak oluşturduğumuz List elemanlarından faydalanarak ülke ve şehirleri listeleyeceğiz öncelikle sayfa ilk yüklendiğinde Ülkeler yüklenecek ardından Ülkeler dropdownlist’inden bir seçim yapıldığında change olayı devreye girecek ve şehirler listelenecektir. şimdi örnek kodlarımıza bakalım gerekli yerlerde yorum satırı ile açıklamalar yapılacaktır.
Ulke.cs
1 2 3 4 5 6 | public class Ulke { public int Id { get; set; } public string Ad { get; set; } public virtual ICollection<Sehir> Sehir { get; set; } } |
Sehir.cs
1 2 3 4 5 6 7 | public class Sehir { public int Id { get; set; } public string Name { get; set; } public int UlkeId { get; set; } public Ulke Ulke { get; set; } } |
KonumViewModel.cs
1 2 3 4 5 6 7 8 | public class KonumViewModel { public int Id { get; set; } [Display(Name = "Ülkeler")] public int UlkdeId { get; set; } [Display(Name = "Şehirler")] public int SehirId { get; set; } } |
KonumController.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | public class KonumController : Controller { public ActionResult Index() { var ulkeler = new List<Ulke> { new Ulke { Ad = "Türkiye", Id = 1 }, new Ulke { Ad = "Azerbeycan", Id = 2 } }; ViewBag.Ulkeler = ulkeler; return View(); } public JsonResult Sehirler(int ulkeId) { var sehirler = new List<Sehir>(); if (ulkeId == 1) { sehirler.AddRange(new Collection<Sehir> { new Sehir {Id = 1, Name = "İstanbul"}, new Sehir {Id = 2, Name = "Kocaeli"} }); } else if (ulkeId == 2) { sehirler.AddRange(new Collection<Sehir> { new Sehir {Id = 1, Name = "Şeki"}, new Sehir {Id = 2, Name = "Bakü"} }); } return Json(sehirler); } } |
Index.cshtml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | @model MvcApplication1.Models.KonumViewModel @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <script src="http://code.jquery.com/jquery-1.11.1.min.js" type="text/javascript"></ script> <script> $(function () { //Ülke seçimi değiştiğinde bu event tetiklenir $("#UlkdeId").on("change", function () { var ulkeid = $(this).val(); // secilen ülkenin id sini kullanarak Konum controller // sınıfı içerisindeki Sehirler metoduna çağrıda bulunuyoruz. // bu metod dan dönen listeyi kullanarak .each fonksiyonu ile // sehirleri dolduruyoruz... if (ulkeid != null && ulkeid != '') { var options = new Array(); options.type = "POST"; options.url = '@Url.Action("Sehirler","Konum")'; options.data = { ulkeId: ulkeid }; options.success = function (res) { $("#SehirId > option").remove(); $.each(res, function (index, sehir) { $("#SehirId").append($('<option/>', { value: sehir.Id, text: sehir.Name })); }); $("#SehirId").removeAttr("disabled"); }; options.error = function (res) { // bu kısımda eğer ajax işlemi başarısız ise // hata mesajı verebiliriz. alert("Hata: " + res.responseText); }; options.beforeSend = function () { // bu kısımda form postalanmadan önce yapılacak // işler belirlenebilir. mesela postalama başladığı // anda loading resmi görüntüleyebiliriz. }; options.complete = function () { // bu kısımda form postalandıktan sonra yapılacak // işler belirlenebilir. mesela postalama bittiği // anda loading resmi gizleyebiliriz. }; $.ajax(options); } }); }); </ script> <title>Index</title> </head> <body> @using (Html.BeginForm()) { <div class="editor-label"> @Html.LabelFor(model => model.UlkdeId) </div> <div class="editor-field"> @Html.DropDownListFor(model => model.UlkdeId, new SelectList(ViewBag.Ulkeler, "Id", "Ad"), "--- Ülke Seçiniz ---") @Html.ValidationMessageFor(model => model.UlkdeId) </div> <div class="editor-label"> @Html.DisplayNameFor(model => model.SehirId) </div> <div class="editor-field"> @Html.DropDownListFor(model => model.SehirId, Enumerable.Empty<SelectListItem>(), new { @disabled = "disabled" }) @Html.ValidationMessageFor(model => model.SehirId) </div> } </body> </html> |
iç içe menü yapa bilir misiniz mesela istanbul şehrine gelince bi menü daha açılacak