Paginasi Sisi Server tidak berfungsi untuk pembungkus mvc kendo grid halaman pertama

Karena jaringan kendo saya memerlukan terlalu banyak waktu untuk memuat jika data lebih dari 15.000 catatan, saya berpikir untuk menerapkan paging sisi server.

Saya tidak menggunakan kerangka entitas. Saya menggunakan pembungkus Kendo MVC dan prosedur Tersimpan SQL Server untuk menarik dan menampilkan data.

Saya telah meneruskan dua parameter ke Prosedur sebagai @Skip dan @Take.

Berikut ini kode saya:

Lihat

@(Html.Kendo().Grid(Model)
    .Name("expandedView_" + Model.ToArray()[0].WidgetId.ToString())
    .Columns(columns =>
    {
        columns.Bound(p => p.FacilityNameAbbreviation).Title(@Resource.FacilityName).Width("15%");
        columns.Bound(p => p.DeviceAbbreviation).Title(@Resource.DeviceName).Width("10%");
        columns.Bound(p => p.EventType).Title(@Resource.EventType).Width("40%");
        columns.Bound(p => p.SubEventCode).Title(@Resource.SubAlarmCode).Width("10%").HtmlAttributes(new { style = "text-align:right" });
        columns.Bound(p => p.FacilityEventTime).Title(@Resource.EventTime).Width("15%");
        columns.Bound(p => p.EventStatus).Title(@Resource.Status).Width("10%");
        columns.Bound(p => p.PriorityColor).Hidden(true);
    })
    .Scrollable()
    .Pageable()
    .DataSource(dt => dt
    .Ajax()
    .PageSize(100)
    .Read(read => read.Action("PageWiseData", "DeviceEvent", new { WidgetId = Model.ToArray()[0].WidgetId, FacilityIds = ViewData["Facids"].ToString() }))
    .ServerOperation(true)
    .Model(model => model.Id(p => p.FacilityEventTime)))
)

Tindakan :

[HandleError(ExceptionType = typeof(Exception), View = "ApplicationError")]
public PartialViewResult DeviceEventExpandedView(int WidgetId, string FacilityIds)
{
    var userDetail = sessionContext.UserContextBag;

    int Skip = 0; // for first page data static value is passed
    int Take = 100;

    IList<AMI.WebRole.Models.Widgets.DeviceEventModel> result = _deviceEventClient.DeviceEventsForExpandedView(WidgetId, FacilityIds, TenantId, CustomerId, UserId, this.sessionContext.UserContextBag.CultureName, Skip, Take);

    return PartialView(result);
}


public ActionResult PageWiseData(int WidgetId, string FacilityIds, [DataSourceRequest]DataSourceRequest request)
{
    IList<AMI.WebRole.Models.Widgets.DeviceEventModel> Totalresult = null;

    var Skip = (request.Page - 1) * request.PageSize;
    var Take = request.PageSize;

    Totalresult = _deviceEventClient.DeviceEventsForExpandedView(WidgetId, FacilityIds, TenantId, CustomerId, UserId, this.sessionContext.UserContextBag.CultureName, Skip, Take);

    return Json(new
        {
            Data = Totalresult,
            Total = 1500
        });
}

MASALAH :

Untuk pertama kalinya "DeviceEventExpandedView" dipanggil, tampilan dimuat dan data berhasil ditampilkan, TAPI NOMOR HALAMAN HANYA MUNCUL 1 untuk pertama kalinya. Di grid saya, filter juga ada, setelah saya mengklik filter, metode "PageWiseData" dipanggil lagi, ia menarik 100 catatan dan kali ini menunjukkan nomor halaman untuk halaman berikutnya. Sesuai pemahaman saya untuk kedua kalinya, data yang dikembalikan dalam JSON yang juga mencakup Total=1500, tetapi dalam kasus pertama ketika tampilan sebagian dimuat, jumlah "Total" ini tidak disetel.

Saya tidak dapat menampilkan nomor halaman (dalam kasus saya harus maksimal 15) ketika tampilan sebagian dimuat dan kisi diikat untuk pertama kalinya

ADA YANG BISA MEMBANTU DI SINI, CARA MELEWATI HITUNGAN UNTUK PERTAMA KALI ATAU CARA MENGIKAT GRID DENGAN METODE "PageWiseData" UNTUK PERTAMA KALI....ATAU cara lain untuk melakukan ini...tolong bantu!!


person devgal    schedule 10.07.2015    source sumber
comment
Action Anda salah, biarkan Kendo memfilter hasil Anda seperti yang dijelaskan oleh @hutchonoid.   -  person Rosdi Kasim    schedule 10.07.2015
comment
menurut saya, untuk ini saya harus mengambil semua catatan dari DB terlebih dahulu, benar kan??   -  person devgal    schedule 10.07.2015
comment
Tidak, .ToDataSourceResult(request) akan menerapkan filter dan penomoran halamannya sendiri ke kueri, jadi hanya rekaman yang diperlukan yang akan diambil.   -  person Rosdi Kasim    schedule 10.07.2015


Jawaban (1)


Jika Anda menerapkan hal berikut ini Anda tidak perlu peduli atau khawatir menangani sendiri pagingnya.

  • Ubah variabel totalResult Anda menjadi IQueryable<AMI.WebRole.Models.Widgets.DeviceEventModel> saja
  • Ubah metode DeviceEventsForExpandedView, hapus parameter Skip dan Take dan pastikan juga mengembalikan IQueryable<AMI.WebRole.Models.Widgets.DeviceEventModel>

Jika Anda mengembalikan IQueryable Kendo harus menerapkan pengurutan dan pemfilteran di DB, bukan di memori.

Pastikan juga Anda menggunakan .ToDataSourceResult(request) untuk mengembalikan hasil sebagai berikut:

public ActionResult PageWiseData(int WidgetId, string FacilityIds, [DataSourceRequest]DataSourceRequest request)
{
    IQueryable<AMI.WebRole.Models.Widgets.DeviceEventModel> totalresult = null;

    var totalresults = _deviceEventClient.DeviceEventsForExpandedView(WidgetId, 
          FacilityIds, TenantId, CustomerId, UserId,
           this.sessionContext.UserContextBag.CultureName);

        var results = totalresults.ToDataSourceResult(request);
        return Json(results);

}

Artikel bagus tentang topik ini:

Server Paging, Sorting, dan Filtering dengan Kendo DataSourceRequest

person hutchonoid    schedule 10.07.2015
comment
menurut saya, untuk ini saya harus mengambil semua catatan dari DB terlebih dahulu, benar kan?? - person devgal; 10.07.2015
comment
@devgal Ya, pastikan ia mengembalikan IQueryable yang ditangguhkan. :) - person hutchonoid; 10.07.2015
comment
tetapi Prosedur Tersimpan saya membutuhkan waktu 42 detik jika saya menarik semua catatan, jika saya melewati dan mengambil prosedur untuk 100 catatan, dibutuhkan 13 detik....Saya tidak ingin menarik semua catatan dari DB itu sendiri....bisakah menjadi mungkin?? - person devgal; 10.07.2015
comment
Itu tidak akan menarik semua catatan. Kendo akan menerapkan filter dan penomoran halaman pada kueri, lalu ia akan menarik data yang relevan. - person Rosdi Kasim; 10.07.2015
comment
@RosdiKasim Sesuai pemahaman saya tentang kode di atas, solusi Hutchonoid menarik semua catatan dan menyimpannya dalam variabel totalresults. Setelah ini kita menerapkan filter melalui kode ini, totalresults.ToDataSourceResult(request); - person devgal; 10.07.2015
comment
Jika Anda mengubah tipe pengembalian menjadi IQueryable seperti yang disarankan, kueri belum akan dieksekusi. Google 'kinerja yang dapat diquery vs yang dapat dihitung'. - person Rosdi Kasim; 10.07.2015
comment
@hutchonoid apakah Anda punya solusi?? saya telah menulis ServerOperation sebagai benar, jadi mengapa tidak mengenai Metode Kedua saat memuat halaman?? - person devgal; 10.07.2015
comment
@hutchonoid Juga apa yang saya kembalikan di ActionResult Kedua sebagai json, saya tetap sama di ViewBag ViewBag.CombineData = Json(new { Data = result, Total = 1200 }); , di First ActionResult .. .tetapi tidak dapat mengikat kendo dari viewbag saat memuat halaman di jquery hanya untuk pertama kalinya.. - person devgal; 10.07.2015
comment
@devgal Grid dikonfigurasi untuk ajax, saya tidak menyarankan menggunakan ViewBag. - person hutchonoid; 10.07.2015
comment
@RosdiKasim saya mencari di Google, saya pikir Anda BENAR, ini mendukung eksekusi yang terlambat dan membawa data yang difilter dari server, tidak semuanya ke sisi klien...Izinkan saya mencobanya...**TAPI sebelum itu saya punya kekhawatiran, Apakah kode yang diposting di atas secara otomatis dipanggil pertama kali ketika tampilan sebagian dimuat, jika ya BAGAIMANA??** - person devgal; 10.07.2015
comment
@hutchonoid Saya juga membutuhkan perhatian Anda: untuk pertama kalinya bagaimana solusi kode di atas akan dipanggil setelah tampilan sebagian dimuat?? - person devgal; 10.07.2015
comment
@devgal Kendo hanya akan memanggil metode seperti yang Anda tentukan dalam mark-up Anda. - person hutchonoid; 10.07.2015
comment
@hutchonoid Jadi mengapa tidak dipanggil sebelumnya pada kode TIDAK BEKERJA saya sebelumnya, karena saya juga telah menentukannya di markup waktu itu?? Jawaban pertanyaan ini pasti akan menambah pengetahuan saya...!! - person devgal; 10.07.2015
comment
@devgal Saya pikir mungkin karena tidak menggunakan tipe pengembalian yang diharapkan yaitu menggunakan ToDataSourceResult. - person hutchonoid; 10.07.2015