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