การแบ่งหน้าฝั่งเซิร์ฟเวอร์ไม่ทำงานสำหรับ wrapper mvc kendo grid หน้าแรก

เนื่องจากตารางเคนโด้ของฉันใช้เวลาโหลดมากเกินไปหากข้อมูลมีมากกว่า 15,000 รายการ ฉันจึงคิดว่าจะใช้เพจจิ้งฝั่งเซิร์ฟเวอร์

ฉันไม่ได้ใช้กรอบงานเอนทิตี ฉันใช้ Kendo MVC wrapper และขั้นตอนการจัดเก็บของ SQL Server เพื่อดึงและแสดงข้อมูล

ฉันได้ส่งพารามิเตอร์สองตัวไปยัง Procedure เป็น @Skip และ @Take

ต่อไปนี้เป็นรหัสของฉัน:

ดู

@(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)))
)

การกระทำ :

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

ปัญหา :

เป็นครั้งแรกที่มีการเรียก "DeviceEventExpandedView" มีการโหลดมุมมองและข้อมูลแสดงได้สำเร็จ แต่หมายเลขหน้าปรากฏเป็น 1 เท่านั้นในครั้งแรก ในตารางของฉัน มีตัวกรองอยู่ด้วย เมื่อฉันคลิกที่ตัวกรอง วิธีการที่เรียกว่า "PageWiseData" จะถูกเรียกอีกครั้ง โดยจะดึงข้อมูล 100 รายการ และคราวนี้จะแสดงหมายเลขหน้าสำหรับหน้าถัดไป ตามความเข้าใจครั้งที่สองของฉัน ข้อมูลที่ส่งคืนอยู่ใน JSON ซึ่งรวมถึง Total=1500 ด้วย แต่ในกรณีแรกเมื่อโหลดมุมมองบางส่วน การนับ "Total" นี้จะไม่ถูกตั้งค่า

ฉันไม่สามารถแสดงหมายเลขหน้าได้ (ในกรณีของฉันควรจะเกิน 15) เมื่อโหลดมุมมองบางส่วนและตารางถูกผูกไว้เป็นครั้งแรก

ใครสามารถช่วยได้ที่นี่ วิธีการนับเป็นครั้งแรก หรือวิธีผูกตารางด้วยวิธี "PageWiseData" เป็นครั้งแรก....หรือวิธีอื่นใดในการทำเช่นนี้...กรุณาช่วย !!


person devgal    schedule 10.07.2015    source แหล่งที่มา
comment
Action ของคุณกำลังทำผิด ให้เคนโด้กรองผลลัพธ์ของคุณตามที่อธิบายโดย @hutchonoid   -  person Rosdi Kasim    schedule 10.07.2015
comment
ฉันคิดว่าสำหรับสิ่งนี้ฉันต้องดึงบันทึกทั้งหมดจาก DB ก่อนใช่ไหม ??   -  person devgal    schedule 10.07.2015
comment
ไม่ .ToDataSourceResult(request) จะใช้ตัวกรองและการแบ่งหน้าของตัวเองกับแบบสอบถาม ดังนั้นระบบจะดึงเฉพาะบันทึกที่จำเป็นเท่านั้น   -  person Rosdi Kasim    schedule 10.07.2015


คำตอบ (1)


หากคุณใช้สิ่งต่อไปนี้ คุณไม่ควรกังวลหรือกังวลเกี่ยวกับการจัดการเพจด้วยตนเอง

  • เปลี่ยนตัวแปร totalResult ของคุณให้เป็น IQueryable<AMI.WebRole.Models.Widgets.DeviceEventModel> แทน
  • เปลี่ยนเมธอด DeviceEventsForExpandedView ลบพารามิเตอร์ Skip และ Take และตรวจสอบให้แน่ใจว่าส่งคืน IQueryable<AMI.WebRole.Models.Widgets.DeviceEventModel>

หากคุณส่งคืน IQueryable Kendo ควรใช้การเรียงลำดับและการกรองที่ฐานข้อมูลมากกว่าในหน่วยความจำ

ตรวจสอบให้แน่ใจว่าคุณใช้ .ToDataSourceResult(request) เพื่อส่งคืนผลลัพธ์ดังต่อไปนี้:

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

}

บทความดีๆในหัวข้อ:

การเพจเซิร์ฟเวอร์ การเรียงลำดับ และการกรองด้วย Kendo DataSourceRequest

person hutchonoid    schedule 10.07.2015
comment
ฉันคิดว่าสำหรับสิ่งนี้ฉันต้องดึงบันทึกทั้งหมดจาก DB ก่อนใช่ไหม ?? - person devgal; 10.07.2015
comment
@devgal ใช่เพียงตรวจสอบให้แน่ใจว่าส่งคืน IQueryable ซึ่งถูกเลื่อนออกไป :) - person hutchonoid; 10.07.2015
comment
แต่ขั้นตอนการจัดเก็บของฉันใช้เวลา 42 วินาทีถ้าฉันดึงบันทึกทั้งหมด ถ้าฉันผ่านข้ามและดำเนินการขั้นตอนสำหรับ 100 รายการจะใช้เวลา 13 วินาที....ฉันไม่ต้องการดึงบันทึกทั้งหมดจาก DB เอง....สามารถทำได้หรือไม่ เป็นไปได้?? - person devgal; 10.07.2015
comment
มันจะไม่ดึงบันทึกทั้งหมด เคนโด้จะใช้ตัวกรองและการแบ่งหน้ากับข้อความค้นหา จากนั้นจะดึงบันทึกที่เกี่ยวข้อง - person Rosdi Kasim; 10.07.2015
comment
@RosdiKasim ตามความเข้าใจของฉันเกี่ยวกับโค้ดข้างต้น โซลูชันของ Hutchonoid กำลังดึงบันทึกทั้งหมดและเก็บไว้ในตัวแปรผลรวมทั้งหมด หลังจากนี้เราจะใช้ตัวกรองผ่านโค้ดนี้ Totalresults.ToDataSourceResult(request); - person devgal; 10.07.2015
comment
หากคุณเปลี่ยนประเภทการส่งคืนเป็น IQueryable ตามที่แนะนำ แบบสอบถามจะยังไม่ได้รับการดำเนินการ Google 'ประสิทธิภาพที่สามารถเปรียบเทียบได้เทียบกับประสิทธิภาพที่นับไม่ถ้วน' - person Rosdi Kasim; 10.07.2015
comment
@hutchonoid คุณมีวิธีแก้ไขอะไรบ้าง?? ฉันเขียน ServerOperation ว่าเป็นจริง แล้วเหตุใดจึงไม่กดปุ่มวิธีที่สองในการโหลดหน้าเว็บ - person devgal; 10.07.2015
comment
@hutchonoid นอกจากนี้สิ่งที่ฉันกลับมาใน Second ActionResult ในฐานะ json ฉันยังคงเหมือนเดิมใน ViewBag ViewBag.CombineData = Json(new { Data = result, Total = 1200 }); ใน First ActionResult .. .แต่ไม่สามารถผูกเคนโด้จาก viewbag ในการโหลดเพจใน jquery ได้เป็นครั้งแรกเท่านั้น .. - person devgal; 10.07.2015
comment
@devgal ตารางได้รับการกำหนดค่าสำหรับ ajax ฉันจะไม่แนะนำให้ใช้ ViewBag - person hutchonoid; 10.07.2015
comment
@RosdiKasim ฉัน googled ฉันคิดว่าคุณพูดถูก รองรับการประมวลผลล่าช้าและนำข้อมูลที่กรองแล้วจากเซิร์ฟเวอร์ ไม่ใช่ทั้งหมดไปยังฝั่งไคลเอ็นต์ ... ฉันลองดูสิ ... ** แต่ก่อนหน้านั้นฉันมี กังวลว่าโค้ดที่โพสต์ข้างต้นจะถูกเรียกโดยอัตโนมัติเป็นครั้งแรกเมื่อมีการโหลดมุมมองบางส่วนหรือไม่ ถ้าใช่ อย่างไร??** - person devgal; 10.07.2015
comment
@hutchonoid ฉันต้องการความสนใจจากคุณเช่นกัน: เป็นครั้งแรกที่โซลูชันโค้ดข้างต้นจะถูกเรียกหลังจากโหลดมุมมองบางส่วนแล้วอย่างไร - person devgal; 10.07.2015
comment
@devgal Kendo จะเรียกใช้เมธอดตามที่คุณระบุไว้ในมาร์กอัปของคุณ - person hutchonoid; 10.07.2015
comment
@hutchonoid แล้วเหตุใดจึงไม่ถูกเรียกก่อนหน้านี้ในรหัสไม่ทำงานก่อนหน้านี้ของฉัน อย่างที่ฉันระบุไว้ในมาร์กอัปครั้งนั้นด้วย ?? ตอบคำถามนี้จะเพิ่มพูนความรู้อย่างแน่นอน...!! - person devgal; 10.07.2015
comment
@devgal ฉันคิดว่าอาจเป็นเพราะมันไม่ได้ใช้ประเภทการส่งคืนที่คาดหวังเช่นการใช้ ToDataSourceResult - person hutchonoid; 10.07.2015