Menü Oluşturma Senaryosunda Yazdığımız Kodu Nasıl Kısaltırız?
21 Jun 2020Öncelikle bu örneği Asp.Net Core ile yaptığımı belirteyim. Senaryomuz şu şekilde. Bir menümüz var ve bu menünün alt menüleri var. Biz bunları ekrana bastıracağız. Veriler veritabanından da gelebilir ama ben bu örnekte verileri (hard-coded) yani kodun içine ekleyeceğim. Menüyü ekrana bastırmak icin bir MenuIndexViewModel var. Bunun özelliklerinden biri ChildList yani alt menü. ChildList bir MenuListViewModel tipinde. ViewModel’lerimiz aşağıdaki sekilde.
using System.Collections.Generic;
namespace Deneme.ViewModels{
public class MenuIndexViewModel{
public int Id { get; set; }
public string Title { get; set; }
public string Link { get; set; }
public bool IsOpenInNewTab {get;set;}
public List<MenuListViewModel> ChildList {get;set;}
}
}
namespace Deneme.ViewModels{
public class MenuListViewModel{
public int Id { get; set; }
public string Title { get; set; }
public string Link { get; set; }
}
}
Controller aşağıdaki şekilde.
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using Deneme.ViewModels;
namespace Deneme.Controllers
{
public class HomeController : Controller
{
public IActionResult Index()
{
var child1 = new MenuListViewModel{
Id = 1,
Link ="https://merterr.com",
Title = "merterr.com'a git"
};
var child2 = new MenuListViewModel{
Id = 2,
Link ="https://google.com",
Title = "google.com'a git"
};
var childList = new List<MenuListViewModel>();
childList.Add(child1);
childList.Add(child2);
var model = new MenuIndexViewModel{
Id =1,
Title ="Siteler",
Link ="#",
IsOpenInNewTab = false,
ChildList = childList
};
ViewBag.Menu = model;
return View();
}
}
}
Kod bu şekilde çalışıyor peki daha nasıl kısaltacağız? Oncelikle her child’ı değişkene atamaya gerek yok. new kullanarak listeye ekleyebiliriz.
var childList = new List<MenuListViewModel>{
new MenuListViewModel{
Id = 1,
Link ="https://merterr.com",
Title = "merterr.com'a git"
},
new MenuListViewModel{
Id = 2,
Link ="https://google.com",
Title = "google.com'a git"
}
};
Peki ben bu menüyü projemin her yerinde çağırıyorum. Her seferinde de çağırdığım yerde liste tanımlıyorum. Bu nasıl çözeriz?
public class MenuIndexViewModel{
public MenuIndexViewModel(){
ChildList = new List<MenuListViewModel>(); //constructor' da initialize (ilk yükleme) yapıyoruz.
}
public List<MenuListViewModel> ChildList {get;set;}
}
Artık kodumuzu aşağıdaki şekilde kullanabiliriz.
public class HomeController : Controller
{
public IActionResult Index()
{
var model = new MenuIndexViewModel{
Id =1,
Title ="Siteler",
Link ="#",
IsOpenInNewTab = false,
};
model.ChildList.Add(new MenuListViewModel{
Id = 1,
Link ="https://merterr.com",
Title = "merterr.com'a git"
});
model.ChildList.Add(new MenuListViewModel{
Id = 2,
Link ="https://google.com",
Title = "google.com'a git"
});
ViewBag.Menu = model;
return View();
}
}
Eğer bize liste dönseydi o zaman MenuIndexViewModel’deki listeyi initialize (ilk yükleme) yapmamıza gerek kalmazdı.
var model = new MenuIndexViewModel{
Id =1,
Title ="Siteler",
Link ="#",
IsOpenInNewTab = false,
ChildList = list //dönen liste
};
Bu şekilde kullanıp geçerdik. Ama mapping işlemi gerekiyorsa viewModel’de initialize yapmak bizim işimizi kolaylaştırır. foreach ile farklı tipte gelen bir listenin elemanlarını ChildList’ e atayabiliriz. Ayrıca ViewModel’lerdeki aynı özellikleri tekrar tekrar yazma işinden kurtulmak için bir BaseViewModel tanımlanabilir. BaseViewModel’deki ortak özellikler diğerlerine kalıtılabilir.