Kendo 排序无效
Kendo Sort not working
我已经实现了如下所示的 kendo 网格,分页工作没有任何问题,但排序不工作。你能帮忙吗
CSHTML
<div class="panel">
<div id="CsHistory" class="row">
<div class="col-lg-12 col-md-12 col-sm-12" style="float:none; margin-left:auto; margin-right:auto; margin-top: 10px; margin-bottom: 10px;">
@using PC.Cmgr.Claims.Domain.Models;
@using PC.Cmgr.Claims.Domain.Common;
@using PC.Cmgr.Models;
@using System.Linq;
@(Html.Kendo().Grid<CsAuditTrailViewModel>
()
.HtmlAttributes(new { style = "width:auto; height:auto; text-center;margin-right: 30px;margin-left: 30px; " })
.Name("AllCsHistory")
.Columns(columns =>
{
columns.Bound(o => o.CsAuditTrailId).Title("CsAuditTrailId");
})
.ToolBar(toolBar =>
{
})
.Resizable(resize => resize.Columns(false))
.Reorderable(reorder => reorder.Columns(true))
.Sortable()
.Pageable(pageable => pageable
.Refresh(true)
.PageSizes(true)
.ButtonCount(5))
.DataSource(dataSource => dataSource
.Ajax()
.Batch(true)
.ServerOperation(true)
.Model(model =>
{
model.Id(o => o.CsAuditTrailId);
})
.Read(read => read.Action("GetCHistoryByClaimId", "Claims", new { ClaimId = Model.Claim.ClaimId }))
.Events(events => { events.Sync("sync_handler"); }
)
)
)
</div>
</div>
控制器
public async Task<ActionResult> GetCsHistoryByClaimId([DataSourceRequest] DataSourceRequest request, Guid ClaimId)
{
var CsHistory = await _CsHistoryProxy.GetCsHistoryByClaimId(ClaimId);
var rawData = new ConcurrentBag<CsAuditTrailViewModel>();
var gridData = new List<CsAuditTrailViewModel>();
Parallel.ForEach(CsHistory, (x) =>
{
rawData.Add(
new CsAuditTrailViewModel
{
CsAuditTrailId = x.CsAuditTrailId,
NewData = x.NewData,
OldData = x.OldData,
UpdateDate = x.UpdateDate,
UserId = x.UserId
});
});
ViewData["total"] = rawData.Count();
// Apply paging
if (request.Page > 0)
{
gridData = rawData.Skip((request.Page - 1) * request.PageSize).ToList();
}
gridData = gridData.Take(request.PageSize).ToList();
var result = new DataSourceResult()
{
Data = gridData,
Total = (int)ViewData["total"]
};
return Json(result);
}
您必须根据您的解决方案对其进行自定义。
sort-fields 在您的 DataSourceRequest 中,您可以在控制器中处理它们。看这个例子:
if (request.Sorts.Any())
{
foreach (SortDescriptor sortDescriptor in request.Sorts)
{
if (sortDescriptor.SortDirection == ListSortDirection.Ascending)
{
switch (sortDescriptor.Member)
{
case "OrderID":
orders= orders.OrderBy(order => order.OrderID);
break;
case "ShipAddress":
orders= orders.OrderBy(order => order.ShipAddress);
break;
}
}
else
{
switch (sortDescriptor.Member)
{
case "OrderID":
orders= orders.OrderByDescending(order => order.OrderID);
break;
case "ShipAddress":
orders= orders.OrderByDescending(order => order.ShipAddress);
break;
}
}
}
}
你必须在分页前进行排序...
取自:http://docs.telerik.com/kendo-ui/aspnet-mvc/helpers/grid/custom-binding
来自 Telerik 常见问题解答,
For ajax binding scenarios the ToDataSourceResult extension method must be used to perform the data processing
所以,你必须这样做,
var result = new DataSourceResult()
{
Data = gridData.ToDataSourceResult(request).Data,
Total = (int)ViewData["total"]
};
我已经实现了如下所示的 kendo 网格,分页工作没有任何问题,但排序不工作。你能帮忙吗
CSHTML
<div class="panel">
<div id="CsHistory" class="row">
<div class="col-lg-12 col-md-12 col-sm-12" style="float:none; margin-left:auto; margin-right:auto; margin-top: 10px; margin-bottom: 10px;">
@using PC.Cmgr.Claims.Domain.Models;
@using PC.Cmgr.Claims.Domain.Common;
@using PC.Cmgr.Models;
@using System.Linq;
@(Html.Kendo().Grid<CsAuditTrailViewModel>
()
.HtmlAttributes(new { style = "width:auto; height:auto; text-center;margin-right: 30px;margin-left: 30px; " })
.Name("AllCsHistory")
.Columns(columns =>
{
columns.Bound(o => o.CsAuditTrailId).Title("CsAuditTrailId");
})
.ToolBar(toolBar =>
{
})
.Resizable(resize => resize.Columns(false))
.Reorderable(reorder => reorder.Columns(true))
.Sortable()
.Pageable(pageable => pageable
.Refresh(true)
.PageSizes(true)
.ButtonCount(5))
.DataSource(dataSource => dataSource
.Ajax()
.Batch(true)
.ServerOperation(true)
.Model(model =>
{
model.Id(o => o.CsAuditTrailId);
})
.Read(read => read.Action("GetCHistoryByClaimId", "Claims", new { ClaimId = Model.Claim.ClaimId }))
.Events(events => { events.Sync("sync_handler"); }
)
)
)
</div>
</div>
控制器
public async Task<ActionResult> GetCsHistoryByClaimId([DataSourceRequest] DataSourceRequest request, Guid ClaimId)
{
var CsHistory = await _CsHistoryProxy.GetCsHistoryByClaimId(ClaimId);
var rawData = new ConcurrentBag<CsAuditTrailViewModel>();
var gridData = new List<CsAuditTrailViewModel>();
Parallel.ForEach(CsHistory, (x) =>
{
rawData.Add(
new CsAuditTrailViewModel
{
CsAuditTrailId = x.CsAuditTrailId,
NewData = x.NewData,
OldData = x.OldData,
UpdateDate = x.UpdateDate,
UserId = x.UserId
});
});
ViewData["total"] = rawData.Count();
// Apply paging
if (request.Page > 0)
{
gridData = rawData.Skip((request.Page - 1) * request.PageSize).ToList();
}
gridData = gridData.Take(request.PageSize).ToList();
var result = new DataSourceResult()
{
Data = gridData,
Total = (int)ViewData["total"]
};
return Json(result);
}
您必须根据您的解决方案对其进行自定义。 sort-fields 在您的 DataSourceRequest 中,您可以在控制器中处理它们。看这个例子:
if (request.Sorts.Any())
{
foreach (SortDescriptor sortDescriptor in request.Sorts)
{
if (sortDescriptor.SortDirection == ListSortDirection.Ascending)
{
switch (sortDescriptor.Member)
{
case "OrderID":
orders= orders.OrderBy(order => order.OrderID);
break;
case "ShipAddress":
orders= orders.OrderBy(order => order.ShipAddress);
break;
}
}
else
{
switch (sortDescriptor.Member)
{
case "OrderID":
orders= orders.OrderByDescending(order => order.OrderID);
break;
case "ShipAddress":
orders= orders.OrderByDescending(order => order.ShipAddress);
break;
}
}
}
}
你必须在分页前进行排序...
取自:http://docs.telerik.com/kendo-ui/aspnet-mvc/helpers/grid/custom-binding
来自 Telerik 常见问题解答,
For ajax binding scenarios the ToDataSourceResult extension method must be used to perform the data processing
所以,你必须这样做,
var result = new DataSourceResult()
{
Data = gridData.ToDataSourceResult(request).Data,
Total = (int)ViewData["total"]
};