Asp.Net MVC'de Recursive Fonksiyon Yazmak

20 Nisan 2016 4 dk okuma süresi 231 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.
VS2015'in 3. update'ini yaptıktan sonra asp.net core web uygulaması yaratmak istediğimde şu şekilde bir hata ile karşılaştım. "Exception : The system cannot find the file specified. (Exception from HRESULT: 0x80070002)". Çözümü oldukça basit.

Entity framework code first kullanıyorsanız ve inheritance yapıp yeni bir class yarattığınızda bunun gibi bir hata alırsınız. Bunun nedeni fluent api'nin inheritance yapılan class ile ana class'ın map yapmaya çalışması ve ilgili kolonu veritabanında bulamamasıdır. Çözümü ise inherit olmuş class'a [NotMapped] DataAnnotations attribute'unu eklemek.

Entity Framework 7'nin kesinlikle bilmeniz gereken özellikleri ve yenilikleri