C# ASP.Net MVC ile ile veritabanında bulunan illeri seçince yine veritabanında bulunan o il ile bağlantılı ilçeleri getirmesi için javascript kullanarak jsonresult ile nasıl kodlandığını görelim:
html alanına yazılacak kod:
@model cascading.ViewModel.SehirViewModel @{ ViewBag.Title = "Index"; } <h2>Index</h2> @using(Html.BeginForm("Create","Home", FormMethod.Post)) { <label>İl adı</label> @Html.DropDownListFor(m=>m.SehirID, Model.SehirList) <br /> <br /> <br /> <label>İlçe Adı</label> @Html.DropDownListFor(m=>m.IlceID, Model.IlceList) } @section scripts { <script type="text/javascript"> $(document).ready(function () { $("#SehirID").change(function(){ var id = $(this).val(); var IlceList = $("#IlceID"); IlceList.empty(); $.ajax({ url: '/Home/IlceList', type: 'POST', dataType: 'json', data: { 'id': id }, success: function (data) { $.each(data, function (index, option) { IlceList.append('<option value='+option.Value+'> '+option.Text+'</option>'); }); } }); }); }); </script> }
model alanına yazılacak kod:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace CascadingOrnek.ViewModel { public class SehirViewModel { public SehirViewModel() { this.IlceList = new List<SelectListItem>(); IlceList.Add(new SelectListItem { Text = "Seçiniz", Value = "" }); } public int SehirID { get; set; } public int IlceID { get; set; } public List<SelectListItem> SehirList { get; set; } public List<SelectListItem> IlceList { get; set; } } }
Bir controller oluşturup controller alanına eklenecek kodu yazalım:
using CascadingOrnek.Models; using CascadingOrnek.ViewModel; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace CascadingOrnek.Controllers { public class HomeController : Controller { public ActionResult Index() { SehirViewModel model = new SehirViewModel(); CascadingDBEntities db = new CascadingDBEntities(); List<Sehir> SehirList = db.Sehir.OrderBy(f => f.ŞehirAdi).ToList(); model.SehirList = (from s in SehirList select new SelectListItem { Text = s.ŞehirAdi, Value = s.SehirID.ToString() }).ToList(); model.SehirList.Insert(0, new SelectListItem { Value = "", Text="Seçiniz", Selected=true }); return View(model); } public JsonResult IlceList(int id) { CascadingDBEntities db = new CascadingDBEntities(); List<Ilce> ilcelist = db.Ilce.Where(f => f.SehirID == id).OrderBy(f => f.İlceAdi).ToList(); List<SelectListItem> itemlist = (from i in ilcelist select new SelectListItem { Value = i.IlceID.ToString(), Text = i.İlceAdi }).Tolist(); return Json(itemlist, JsonRequestBehavior.AllowGet); } } }
İlçe Listesi aslında doğru geliyor profiler dan yada breakpoint ile takip edildiğinde bu görülebiliyor fakat ilçe dropdownlist in elemanları undifenid olarak geliyor. Çözümü var mıdır ?
merhaba kaan hocam
Bu konuyu yıldırım söker hocamızdan öğrenmiştim. detaylı bilgi için http://www.yildirimsoker.com/mvc-cascading-dropdownlist/ bakabilirsiniz.
Maalesef Ülke-Şehir yapısı kullanıyorum. Ben videodakinden farklı olarak entiyframework code first yapısı ile verileri çekiyorum.
Ülkeler aynen viewmodel model üzerinden List CountryList gibi bir yapı ile düzgün bie şekilde geliyor. Burada bir problem yok.
Fakat Şehir listesi aynen video da olduğu gibi JSonResult a örneğin CityId ve CityName property lerine düzgün bir şekilde dolar iken (bunu kod üzerinden F10 ile debug yaparak görebiliyorum.)
Dropdownlist te undefined olarak listelenmekteler.