Asp.Net MVC'de Recursive Fonksiyon Yazmak
İlk olarak recursive nedir onu biliyor olmanız gerekiyor. Recursive (yinelenen, tekrarlanan); kendi içinde kendisini çağıran demektir. Bu durumda recursive function'da kendi kendini çağıran fonksiyon oluyor. En basitinden faktoriyel hesaplamayı herkes biliyordur ve bilgisayar/yazılım mühendisliklerinde cmpe derslerinde ilk gösterilen örneklerdendir. Aşağıdaki kod faktoriyel hesabını recursive fonksiyon ile bulmaya yarıyor.
function Factoriyel (sayi) { if (sayi == 0) return 1; else return sayi * Factoriyel(sayi - 1); }
Şimdi diyelimki sınırsız kategorili bir menü sisteminiz var. Ve bunu kullanıcıya listelemek istiyorsunuz. Bu noktada doğal olarak recursive function kullanmanız gerekiyor. MVC'de 2 yöntemle recursive fonksiyon yazabilirsiniz. Bunlardan birisi View tarafında @helper metodu, diğeri ise klasik HtmlHelper metodu. 2 yöntem içinde örnek kodları aşağıda görebilirsiniz.
Razor View Engine, @helper syntax'ı sayesinde kolayca tekrar kullanılabilir metodlar yazmanıza imkan sağlıyor.
Menü modelimizin şu şekilde olduğunu varsayın.
public partial class Kategori { public Kategori() { this.Kategori1 = new List<Kategori>(); } public int Id { get; set; } public Nullable<int> UstKategori { get; set; } public string KategoriAdi { get; set; } public virtual ICollection<Kategori> Kategoriler1 { get; set; } public virtual Kategori Kategori1 { get; set; } }
@Helper Metodu
@helper RecursiveMenu(IEnumerable<Kategori> kategoriler) { <ul> @foreach (var item in kategoriler) { <li> <a href="@Url.Action("Detay", "Kategori", new { id = item.Id })">@item.KategoriAdi</a> @if (item.Kategoriler1.Any()) { @RecursiveMenu(item.Kategoriler1) } </li> } </ul> }
HtmlHelper Metodu
public static string RecursiveMenu(this HtmlHelper helper, Kategori _kategori) { var sb = new StringBuilder(); sb.Append("<li>"); sb.Append("<a href='#'>" + item.KategoriAdi + "</a>"); if (_kategori.Kategoriler1.Any()) { foreach(var item in _kategori.Kategoriler1) { sb.Append("<ul>"); sb.Append(html.RecursiveMenu(item.Kategoriler1); sb.Append("</ul>"); } } sb.Append("</li>"); return sb.ToString(); } // View tarafinda metodu asagidaki gibi cagiriyoruz @foreach(var item in Model.Kategoriler) { @html.RecursiveMenu(item) }