DataTables Ajax ile Doldurma Ve Filtreleme

Datatable Ayarları :

'destroy':true, //yazmazsak  cannot reinitalize hatası alınıyor. Tabloyu boşaltıp tekrar doldurmak için hazır hale getiriyor.
                    "columns": [
                       { "data": "CariId" },
                       { "data": "TcVkNo" },
                       { "data": "Unvan" },
                       { "data": "Durum" },
                       { "data": "Tip" },
                        { "data": "" } //Son sütuna very yüklenmeyecek buton koyulacak. Click olduğunda belli işlemler yapılacak.
                    ],
                    "processing": true, 
                    "serverSide": true,
                    "ajax": {
                        "type": "POST",
                            "url": '/Cari/CariAra',
                            "contentType": 'application/json; charset=utf-8',
                            'data': function (data) { return data = JSON.stringify(data); }
                       
                    },
                    //Id değerini  kayıt sayfasına göndermek için gerekli
                    "columnDefs": [ {
                        "targets": -1,
                        "data": null,
                        "defaultContent": "<button class='sec'>Seç!</button>"
                    } ],

Tablonun verileri : Search kısmında bulunan string , sayfa sayısı, sayfada gösterilecek kayıt sayısı . vb bu verileri ajax ile server tarafına gönderip gerekli sorgulamayı yapıp geri bu verileri client tarafına gönderip datatable yeniden doldurulacaktır.

Sorgulama için ajax ile servertarafına gönderilen tip : DTParameters ve DTResult<T>

nesneleri tipleri aşağıdaki gibidir.

    public class DTResult<T>
    {
        public int draw { get; set; }

        /// Veritabanındaki toplam kayıtsayısı 
        public int recordsTotal { get; set; }

        /// Filtrelemeden sonraki toplam kayıt sayısı  
        public int recordsFiltered { get; set; }

        // Tabloda görüntülenecek veri.
        // BU paramaetre ismi ajaxDT ayarlarının  dataSrc özelliği ile değiştirlebilir
        public List<T> data { get; set; }
    }

    // Otomatik işlem yapmak için gönderien ek kolon 
    public abstract class DTRow
    {
        //dt-tag tr  düğümünün id değeri buraya verilir
        public virtual string DT_RowId
        {
            get { return null; }
        }

        public virtual string DT_RowClass { get { return null; } }

        public virtual object DT_RowData{ get { return null; } }
    }

    //Ajax ile server tarafınagidecek veriler bu sınıftatanımlanmıştır.
    public class DTParameters
    {
        public int Draw { get; set; }

        // Tablonun kolon adlarını içeren dizi
        public DTColumn[] Columns { get; set; }

        /// Kaç tane kolon  sıralanacak, bir eleman varsa tek bir  alana göre sıralanacak.Birden fazlaysa multi-column sort uygulanacak
        public DTOrder[] Order { get; set; }
        
        // Skip() ' te  kullanılacak veri (current dataset in başlangıç noktası )
        public int Start { get; set; }
        
        //o filtreden sonra gösterilecek satır sayısı 
        public int Length { get; set; }

        //Bütün alanlara uygulanan search verisi
        public DTSearch Search { get; set; }

        // İlk sıralama kolonunun  daha ileri sıralanması için kulanılır
        public string SortOrder
        {
            get
            {
                return Columns != null && Order != null && Order.Length > 0
                    ? (Columns[Order[0].Column].Data + (Order[0].Dir == DTOrderDir.DESC ? " " + Order[0].Dir : string.Empty))
                    : null;
            }
        }
    }

     //Ajax sorgusu yaparken gönderilen search bilgisi
    // A search, as sent by jQuery DataTables when doing AJAX queries.
    public class DTSearch
    {
        // Bütün alanlara uygulanan  search verisi
        public string Value { get; set; }

        //Arama için kullanılacak Regex verisi. Çok büük verisetlerini filtrlemekte kullanılabilir.
        public bool Regex { get; set; }
    }
    //  jQuery DataTables column.
    public class DTColumn
    {
        //columns.data  ile tanımlanan kolon verisi 
        public string Data { get; set; }

        // columns.name ile tanımlanan column adi
        public string Name { get; set; }

        //Column searchable mı değil mi anlamında 
        public bool Searchable { get; set; }

        /// Kolon sıralama enabled mı ?  columns.orderable ile ayarlanır
        public bool Orderable { get; set; }

    }
    //Sıralama bilgisi
    public class DTOrder
    {
        // Sıralamada baz alınacak kolon
        public int Column { get; set; }

        // OSıralama Yönü , asc  -   desc
        public DTOrderDir Dir { get; set; }
    }
    public enum DTOrderDir
    {
        ASC,
        DESC
    }

Tabloyu dolduracağımız veri tipi olan kolonlarımızı oluşturacak viewModel nesnemiz aşağıdaki gibidir.

public class CariAraViewModel
    {
        public int CariId { get; set; }
        public string TcVkNo { get; set; }
        public string Unvan { get; set; }
        public string Tip { get; set; }
        public string Durum { get; set; }
    } 

Ve son olarak filtrleme yapıp Json döndüren yeni tablo verilerini dönderen metodumuz :

Arama Metodu  : 
//Dtparameters ile ajaxtan datatable verileri geliyor. Bu verileri kullanarak  filtreleme yapıp geri değerleri döndereceğiz.
        public JsonResult CariAra(DTParameters param)
        {
            int filteredCount = 0;
            int count = 0;

            List<CariAraViewModel> cariler = new List<CariAraViewModel>();
            using (var db = new KSEticaretEntities())
            {
                var cariler2 = Partial.Cariler;

//Cariler tablosunun verileri filtreleniyor.
                cariler = db.Caris.AsNoTracking()
                   .Where(p => (param.Search.Value == null || (p.CariTCVKNo != null && p.CariTCVKNo.ToLower().Contains(param.Search.Value.ToLower()) || p.CariUnvan != null && p.CariUnvan.ToLower().Contains(param.Search.Value.ToLower()))))
                .Include(c => c.CariTip)
                .Include(c => c.CariDurum).OrderBy(m => m.CariId).Skip(param.Start).Take(param.Length)
                   .Select(c => new CariAraViewModel { CariId = c.CariId, TcVkNo = c.CariTCVKNo, Unvan = c.CariUnvan, Tip = c.CariTip.CariTipAdi, Durum = c.CariDurum.CariDurumAdi }).ToList();


                filteredCount = Partial.Cariler
                   .Where(p => (param.Search.Value == null || (p.CariTCVKNo != null && p.CariTCVKNo.ToLower().Contains(param.Search.Value.ToLower()) || p.CariUnvan != null && p.CariUnvan.ToLower().Contains(param.Search.Value.ToLower())))).OrderBy(m => m.CariId).Skip(param.Start).ToList().Count();

                count = Partial.Cariler.Count();
            }
            
            DTResult<CariAraViewModel> result = new DTResult<CariAraViewModel>
            {
                draw = param.Draw,
                data = cariler,
                recordsFiltered = filteredCount,
                recordsTotal = count
            };
            return Json(result, JsonRequestBehavior.AllowGet);
            
        }

Yorum Yaz

Yorumlarınız denetimden geçtikten sonra yayınlanmaktadır...