Merhaba MVC Severler, “ASP.NET MVC 3 Razor ile Uygulama Geliştirme Yazı Dizi”sine devam ediyorum. Aynı zamanda aklıma geldikçe ipuçları paylaşacağım sizlerle. Biliyorsunuz MVC’de Server kontrolleri yok dolayısıyla post back mekanizması da yok. Bu yüzden DropDownList kullanacağımız zaman DropDownList’ten seçili olan öğeyi değiştirdiğinizde arkada çalışacak herhangi bir event bulunmamaktadır. Senaryo DropDownList’e (Select List) şehirlerimi ekledim ve şehir seçimi değiştiği anda Home Controller içerisindeki City Action’ına parametre olarak şehir id’sini yollasın.
Çözüm
Yöntem 1: İmdatımıza javascript kodları eventleri yetişiyor. Burada “ddlSehirleri” bir form içerisinde alıyoruz ve change anında içerisinde olduğu formu tetikletmek: HomeController.cs
public ActionResult City(string ddlSehirler)
{
List<Sehir> sehirler = new List<Sehir>();
sehirler.Add(new Sehir() { sehirID = 1, sehirAdi = "Adana" });
sehirler.Add(new Sehir() { sehirID = 6, sehirAdi = "Ankara" });
sehirler.Add(new Sehir() { sehirID = 34, sehirAdi = "İstanbul" });
sehirler.Add(new Sehir() { sehirID = 35, sehirAdi = "İzmir" });
int sehirID = int.Parse(ddlSehirler);
ViewBag.Sehir = sehirler.Where(x=>x.sehirID==sehirID).FirstOrDefault().sehirAdi;
return View();
}
<script type="text/javascript">
$(document).ready(function () {
$("#ddlSehirler").change(function () {
var donen = $("#ddlSehirler").val();
window.location.href = "/City/"+ donen;
});
});
</script>
global.asax'ta yeni Route tanımlama:
routes.MapRoute(
"cityRoute",
"city/{id}",
new { controller = "Home", action = "City", id = 0 }
);
Burada dikkat etmemiz gereken, eğer onchange anında yazarsak, controller içerisine parametre olarak göndermemiz için actionresult içerisinde de dropdownlist’in adında bir parametre almalıdır. Eğer jQuery ile yaparsak route tanımlayıp istediğimiz parametre yollayabiliriz.
Umarım faydalı bir yazı olmuştur.
Sonraki yazılarımda görüşmek üzere, MVC ile kalın.





#1 by Ali on Şubat 22, 2012 - 5:44 pm
MVC 3 le ilgili bir sorum olacak; forumlarda da oldukca yaygın bir problem olmasına rağmen hiçbir çözüm işe yaramadı. DropdownlistFor yada Dropdownlist elementini selectlist üzerinden populate ederken selectedvalue hiçbir şekilde set edilmiyor.
//Model class
[Display(Name = "Ülke")]
public string SelectedCountryId { get; set; }
public Dictionary Countries
{
get
{
Dictionary clist = new Dictionary();
clist.Add(“33″, “Fransa”);
clist.Add(“90″, “Türkiye”);
return clist;
//return Parameters.Current.Countries;
}
}
//View
@Html.LabelFor(model => model.SelectedCountryId)
@Html.DropDownListFor(model=>model.SelectedCountryId,
new SelectList(Model.Countries, “Key”, “Value”, Model.SelectedCountryId),
“seçiniz”)
@Html.ValidationMessageFor(m => m.SelectedCountryId, “*”)
#2 by Mahmut Can Sözeri on Şubat 23, 2012 - 12:26 am
Merhaba,
Key ve Value verdiğiniz yerlere bu değerlere karşılık gelecek öğeleri yazmalısınız. Örnek kullanım:
Controller İçerisi:
var kategoriler = db.Categories.OrderBy(x => x.name).AsEnumerable().Select(x => new SelectListItem{
Text = x.name,
Value = x.ID.ToString(),
});
ViewBag.Deneme = kategoriler;
cshtml İçeriği:
@Html.DropDownList("deneme")Bu kod işinizi görecektir.
İyi günler
#3 by Ali on Şubat 23, 2012 - 2:51 am
Göndermiş olduğunuz kod dropdownlist’in populate edilmesini sağlıyor. Problem, dropdownlist populate olduktan sonra modeldeki property’nin selected value olarak set edilmesinde.
//Controller
var clist = db.Parameters
.Where(p => p.type == “CNTRY”)
.OrderBy(x => x.ptext)
.AsEnumerable()
.Select(x => new SelectListItem
{
Value = x.pvalue,
Text = x.ptext
});
ViewBag.CountryId = clist;
//cshtml
@Html.DropDownList(“CountryId”,”please select..”)
//oluşan html
please select..
Fransa
Türkiye