Asp.Net MVC'de Recursive Fonksiyon Yazmak

20 Nisan 2016 4 dk okuma süresi 400 okunma

İ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)
}


Yazılarıma abone olmak ister misiniz?
Spam yapılmaz, sadece bildirim amaçlıdır. İstediğiniz zaman abonelikten çıkabilirsiniz.
İlginizi çekebilecek diğer yazılar.
Form post ile giden tüm dataları loglama

Asp.net Core ile farklı bir class library'den appsettings json dosyasını kolayca okumak

Hatalı bundle kullanımından dolayı alınan MIME type hatası ve çözümü