Asp .Net MVC'de içiçe sınırsız ağaç yapısı

İçiçe sınırsız ağaç yapısı asp .net mvc'de nasıl yapılır? İşte cevabı:

Önce MODEL 'i görelim.

    public class KategoriAgac
    {
        public int KategoriId { get; set; }

        public string KategoriAdi { get; set; }

        public int? BagliKategoriId { get; set; }

        public List<KategoriAgac> Evlatlar { get; set; }
    }


Şimdi de CONTROLLER'i görelim.

public ActionResult Index()
{
            IEnumerable tumKategoriler = from p in _kategorilerTablo.Kategoriler
                                                       select new KategoriAgac()
                                                       {
                                                           KategoriId = p.KategoriId,
                                                           KategoriAdi = p.KategoriAdi,
                                                           BagliKategoriId = p.BagliKategoriId
                                                       };

            var ataKategori = tumKategoriler.Single(m => m.BagliKategoriId == null);
            LoadChildren(ataKategori, tumKategoriler);

            return View(ataKategori);
}


public void LoadChildren(KategoriAgac buKategori, IEnumerable tumKategoriler)
{
            buKategori.Evlatlar = tumKategoriler.Where(m => m.BagliKategoriId == buKategori.KategoriId).ToList();

            foreach (var evlatKategori in buKategori.Evlatlar)
            {
                LoadChildren(evlatKategori, tumKategoriler);
            }
}

Görüldüğü gibi modeli Index metodunda doldurduktan sonra View'e gönderiyoruz. Modelin alt kategorilerini LoadChildren methodu dolduruyor. Bu method kendini çağıran(recursive) bir özelliğe sa.

Şimdi de VIEW'e bakalım.


@Html.Hidden("VerEtiketler", Url.Action("VerEtiketler", "Sor"))

@helper ShowTree(KategoriAgac kategoriAgac)
{
           @foreach (var evlat in kategoriAgac.Evlatlar)
    {
@evlat.KategoriAdi @if (evlat.Evlatlar.Any()) { @ShowTree(evlat) } } }

Yukarıda gördüğünüz gibi, MVC nin yapısında bulunan yardımcı method ile, view tarafında kendini çağıran(recursive) bir method oluşturabiliyoruz ve bu methodu yine view tarafında kullanabiliyoruz.

Sonuçta oluşan içiçe liste yapısı şöyle birşey oluyor:
  • Mühendislikler
    • Elektrik Elektronik
    • Bilgisayar

Yorumlar

  1. Controller sayfasında bu yanlış değilmi

    YanıtlaSil
    Yanıtlar
    1. Merhaba, yanlış olduğunu düşündüğünüz şey tam olarak nedir ?

      Sil
  2. Merhaba bu çalışmanız için teşekkür ederim fakat şöyle bir hata alıyorum.

    Severity Code Description Project File Line Suppression State
    Error CS1061 'IEnumerable' does not contain a definition for 'Sigle' and no extension method 'Sigle' accepting a first argument of type 'IEnumerable' could be found (are you missing a using directive or an assembly reference?)

    YanıtlaSil
    Yanıtlar
    1. Bu yorum yazar tarafından silindi.

      Sil
    2. Merhaba,

      Hata için kısa bir araştırma yaptım. Sanırım aşağıda verdiğim linkte sizin sorununuzu çözecek. Açıklayacak olursam


      View'inizde model olarak IEnumerable kullanırsanız, bu view'in içinde @Model.Sigle gibi bir kullanım yapamazsınız. Yani

      1- Yanlış olan:

      @model IEnumerable
      ...
      @Model.Sigle
      -------------------------------------------------------------------------------------------------
      2- Doğru olan (Falan nesnesi, Sigle'ı içermesi gerekiyor tabi):

      @model Falan
      ...
      @Model.Sigle

      İşinizi görür umarım.

      ------------------
      http://stackoverflow.com/questions/36240150/cs1061-ienumerable-does-not-contain-a-definition-for-and-no-extension-me

      Sil
    3. merhaba bende aynı hatayı alıyorum ve çözümü tam anlayamadım;
      Single nesnesini nerde tanımlamalıyız veya ayrıntılı bir anlatı yokmudur?

      Sil

Yorum Gönder