Asp.net Core Recursive Kullanım

Asp.net Core Recursive Kullanım

umutduran

16 Tem, 2020 01:16

umutduran

Merhabalar,

Bu yazımızda sizler için çok faydalı olacak bir konuya değineceğim. Recursive methodlar ve kullanımlar.

Recursive Ne Demek?

Arkadaşlar recursive kelime anlamı ile kendi kendini çağıran veya tekrar eden diyebiliriz. Örneğin sitenizde dinamik olarak kategori veya menü düşünüyorsunuz. Doğal olarak iç içe bir yapı ile sonsuza gitmesini isteyeceksinizdir. En azından bu ücretli bir projede müşterilerinizin sizden isteyebileceği bir konu. Bunu nasıl yapmanız gerektiğini ise aşağıda anlatıyorum.

Öncelikle modeliniz aşağıdaki şekilde olmalı fakat kendi yaptığınız bir modele de uyarlayabilirsiniz. Ben bu siteyi yaparken daha karmaşık bir şekilde yaptım ama işin özü fonksiyon veya partial kendini çağıracağı zaman içerisine ilk başta döndürdüğünüz model tipinin aynısını koymanız gerekiyor. 

_Anamenu.cshtml

@model ViewModel;

@foreach (var item in Model.Menu)
{
    <li class="nav-item @if (item.altmenuler.Count > 0) { var classIsmi = "submenu dropdown"; @classIsmi; }">
        <a class="nav-link @if (item.altmenuler.Count > 0) { var classIsmi = "dropdown-toggle"; @classIsmi; }" @if (item.altmenuler.Count > 0) { var classIsmi = "data-toggle=\"dropdown\" role=\"button\" aria-haspopup=\"true\" aria-expanded=\"false\""; @Html.Raw(classIsmi) ; } href="@item.menulink">@Html.Raw(item.menuolustur.Adi)</a>
        @if (item.altmenuler.Count > 0)
        {
            @:<ul class="dropdown-menu">


                ViewModel view = new ViewModel();

                view = Model;
                view.Menu = item.altmenuler;

                foreach (var altmenu in item.altmenuler)
                {
                    @:<li class="nav-item"><a class="nav-link" href="@altmenu.menulink">@altmenu.menuolustur.Adi</a></li>
                }

                await Html.PartialAsync("_Anamenu", view);

            @:</ul>
        }
    </li>
}

Örneğin yukarıda bu siteyi yazarken iç içe menüler elde etmek için kullandığım bir recursive partial bulunuyor. 

Bunu ise aşağıdaki kodu kullanarak layout.cshtml'den çağırdım.

@{ await Html.RenderPartialAsync("_Anamenu"); }

Fakat burada dikkat etmeniz gereken en önemli nokta kullandığınız modelin türüdür. Ben model olarak ViewModel tanımladım ve bunu bütün sayfalarıma çektim. Böylece tek tek çağırmak yerine her sayfayı rahatça doldurabiliyorum.

Fakat şu kod,

  ViewModel view = new ViewModel();

                view = Model;
                view.Menu = item.altmenuler;

gördüğünüz gibi tanımladığım ViewModel'in içerisinden Menu alanını yeniden atıyorum. Çünkü eğer alt menü varsa bu alt menü listesini modelin içine atayıp aşağıdaki kod ile birlikte yeniden çağırıyorum. 

await Html.PartialAsync("_Anamenu", view);

Böylece ilk layout sayfasından çağırdığım partial sayfam daha sonra kendisini tekrar ederek sonsuza kadar ilerliyor. Alt menüsü 0 olan bir menü elementine denk geldiği zaman ise bir sonraki menü elementine geçmesini sağlıyor. Listedeki bütün menüler bittiği zaman döngü de sona ererek benim sayfamı oluşturuyor.

Kafanız karışabilir. Özellikle benim kullandığım yapı biraz daha karmaşık, veri tabanımı yani modellerimi düzenlerken foreign key kullanmadığım için ViewModel kullanarak işimi biraz zorlaştırdım. 

Aklınıza takılan bir konu olursa yorumlarda belirtmeyi unutmayın. 

İyi bloglamalar!

Aşağıya mail adresini girerek web sitemdeki makalelere abone olabilirsin. İlgini çekecek bir makale yazdığım zaman seni haberdar edebilirim!

Yorum Yap

*HTML kodlarına izin verilmemektedir. Düz metin olarak yorum giriniz.