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
Code
Controller
Function
Index()
As
ActionResult
Return
View(
New
BO.Models.LocationGridModel)
End
Function
Function
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
Function
LocationGridModel
Imports
System.Collections.ObjectModel
Imports
System.ComponentModel
Imports
Kendo.Mvc
Namespace
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
Class
End
Namespace