I have some grids using telerik MVC controls that I am trying to move to Kendo.
They handle large amounts of data so I want to use custom binding.
so far I have got the grid to load with data, but when trying to sort or filter I get sorts or filter is null.
Where am I going wrong,
Thanks
My grid
Controller
LocationGridModel
They handle large amounts of data so I want to use custom binding.
so far I have got the grid to load with data, but when trying to sort or filter I get sorts or filter is null.
Where am I going wrong,
Thanks
My grid
@code Dim grid As Kendo.Mvc.UI.Grid(Of BO.Models.Location) = Html.Kendo.Grid(Of BO.Models.Location)(Model.Locations) _ .Name("LocationGrid") _ .EnableCustomBinding(True) _ .Columns(Sub(c) c.Bound(Function(b) b.ZipCode) c.ForeignKey(Function(f) f.StateId, Model.States.AsEnumerable, "Id", "Name") c.Bound(Function(b) b.City) c.Bound(Function(b) b.Longitude) c.Bound(Function(b) b.Latitude) 'c.Command(Sub(m) ' m.Edit() ' 'm.Custom("Details").Text("Details").Action("details", "location", New With {.area = "admin"}) ' End Sub).Width(210) End Sub) _ .DataSource(Function(d) _ d.Ajax.Read("GetLocations", "Location", New With {.area = "admin"}).Update("UpdateLocation", "Location", New With {.area = "admin"}) _ .ServerOperation(True).Model(Sub(model) model.Id(Function(p) p.LocationId)).Total(Model.RecordCount)).Sortable().Filterable().Pageable() grid.Render()End CodeController
Function Index() As ActionResult Return View(New BO.Models.LocationGridModel)End FunctionFunction GetLocations(<Kendo.Mvc.UI.DataSourceRequestAttribute(Prefix:="Grid")> request As Kendo.Mvc.UI.DataSourceRequest) As JsonResult If request.PageSize.Equals(0) Then request.PageSize = 10 End If Dim LocationGridModel As BO.Models.LocationGridModel = New BO.Models.LocationGridModel(request) Return Json(LocationGridModel.Locations.ToList)End Function<HttpPost>Function UpdateLocation(id As Integer, collection As FormCollection, <Kendo.Mvc.UI.DataSourceRequestAttribute(Prefix:="Grid")> request As Kendo.Mvc.UI.DataSourceRequest) As JsonResult Dim Location As EF.Location = db.Locations.Find(id) Try UpdateModel(Location) db.SaveChanges() Catch ex As Exception Throw End Try Dim LocationGridModel As BO.Models.LocationGridModel = New BO.Models.LocationGridModel(request) Return Json(LocationGridModel.Locations.ToList)End FunctionLocationGridModel
Imports System.Collections.ObjectModelImports System.ComponentModelImports Kendo.MvcNamespace Models Public Class LocationGridModel Public Property PageSize As Integer = 15 Private _Locations As ReadOnlyCollection(Of BO.Models.Location) Public ReadOnly Property Locations As ReadOnlyCollection(Of BO.Models.Location) Get Return _Locations End Get End Property Public Property States As ReadOnlyCollection(Of BO.Models.StateDropDown) Public Property RecordCount As Integer Sub New() Using db As EF.HomelyEntities = New EF.HomelyEntities Me._Locations = ConvertToDbMoldelsLocation(db.Locations.OrderBy(Function(o) o.LocationId).Take(Me.PageSize)) Me.RecordCount = db.Locations.Count Me.States = New ReadOnlyCollection(Of BO.Models.StateDropDown)(db.States.Where(Function(w) w.CountryId.Equals(2)).OrderBy(Function(o) o.Name).Select(Function(s) New BO.Models.StateDropDown With {.Id = s.StateId, .Name = s.Name}).ToList) End Using End Sub Sub New(request As UI.DataSourceRequest) Using db As EF.HomelyEntities = New EF.HomelyEntities Me._Locations = GetData(request, Me.RecordCount) Me.States = New ReadOnlyCollection(Of BO.Models.StateDropDown)(db.States.Where(Function(w) w.CountryId.Equals(2)).OrderBy(Function(o) o.Name).Select(Function(s) New BO.Models.StateDropDown With {.Id = s.StateId, .Name = s.Name}).ToList) End Using End Sub ''' <summary> ''' Reterns location data for kendo grid ''' </summary> ''' <param name="request">Kendo.Mvc.UI.DataSourceRequest</param> ''' <param name="recordCount">Integer</param> ''' <returns>ReadOnlyCollection(Of BO.Models.Location)</returns> ''' <remarks></remarks> Private Function GetData(ByVal request As Kendo.Mvc.UI.DataSourceRequest, ByRef recordCount As Integer) As ReadOnlyCollection(Of BO.Models.Location) Using db As EF.HomelyEntities = New EF.HomelyEntities 'todo remove recordcount Dim data As IQueryable(Of EF.Location) = db.Locations If request.Sorts.Any Then For Each sortDescriptor As SortDescriptor In request.Sorts data = SortLocation(sortDescriptor, data) Next Else data = data.OrderBy(Function(o) o.LocationId) End If If request.Filters.Any() Then data = data.Where(ExpressionBuilder.Expression(Of EF.Location)(request.Filters)) End If recordCount = data.Count If request.PageSize > 0 Then data = data.Skip((request.Page - 1) * request.PageSize) data = data.Take(request.PageSize) End If Return ConvertToDbMoldelsLocation(data) End Using End Function Private Function SortLocation(sortDescriptor As SortDescriptor, data As IQueryable(Of EF.Location)) As IQueryable(Of EF.Location) If sortDescriptor.SortDirection.Equals(ListSortDirection.Ascending) Then Select Case sortDescriptor.Member Case "LocationId" data = data.OrderBy(Function(o) o.LocationId) Case "ZipCode" data = data.OrderBy(Function(o) o.ZipCode) Case "StateId" data = data.OrderBy(Function(o) o.StateId) Case "Latitude" data = data.OrderBy(Function(o) o.Latitude) Case "Longitude" data = data.OrderBy(Function(o) o.Longitude) Case "City" data = data.OrderBy(Function(o) o.City) End Select Else Select Case sortDescriptor.Member Case "LocationId" data = data.OrderByDescending(Function(o) o.LocationId) Case "ZipCode" data = data.OrderByDescending(Function(o) o.ZipCode) Case "StateId" data = data.OrderByDescending(Function(o) o.StateId) Case "Latitude" data = data.OrderByDescending(Function(o) o.Latitude) Case "Longitude" data = data.OrderByDescending(Function(o) o.Longitude) Case "City" data = data.OrderByDescending(Function(o) o.City) End Select End If Return data End Function ''' <summary> ''' Converts to poco model to use in grid ''' </summary> ''' <param name="data">IQueryable(Of EF.Location)</param> ''' <returns>ReadOnlyCollection(Of BO.Models.Location)</returns> ''' <remarks></remarks> Private Shared Function ConvertToDbMoldelsLocation(data As IQueryable(Of EF.Location)) As ReadOnlyCollection(Of BO.Models.Location) Return New ReadOnlyCollection(Of BO.Models.Location)(data.Select(Function(s) New BO.Models.Location With { .ZipCode = s.ZipCode, .StateId = s.StateId, .City = s.City, .Longitude = s.Longitude, .Latitude = s.Latitude, .LocationId = s.LocationId }).ToList) End Function End ClassEnd Namespace