This is a migrated thread and some comments may be shown as answers.

EnableCustomBinding problems with sort and filter

3 Answers 251 Views
Grid
This is a migrated thread and some comments may be shown as answers.
Alan Mosley
Top achievements
Rank 1
Alan Mosley asked on 28 Jan 2013, 04:32 AM
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
@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

3 Answers, 1 is accepted

Sort by
0
Daniel
Telerik team
answered on 30 Jan 2013, 06:06 AM
Hello,

The problem could be caused by the prefix used for the DataSourceRequestAttribute because the parameters are not prefixed when using Ajax binding. Another common reason for this problem is that the kendo.aspnetmvc JavaSript file is not included correctly.

Regards,
Daniel
the Telerik team
Join us on our journey to create the world's most complete HTML 5 UI Framework - download Kendo UI now!
0
Alan Mosley
Top achievements
Rank 1
answered on 30 Jan 2013, 03:40 PM
I checked the scripts the are all present and returning a 200 status code
    <script src="/Scripts/jquery-1.8.3.js"></script>
<script src="/Scripts/jquery.unobtrusive-ajax.js"></script>
<script src="/Scripts/jquery.validate.js"></script>
<script src="/Scripts/jquery.validate.unobtrusive.js"></script>
<script src="/Scripts/kendo/kendo.all.min.js"></script>
<script src="/Scripts/kendo/kendo.aspnetmvc.min.js"></script>
I removed <Kendo.Mvc.UI.DataSourceRequestAttribute(Prefix:="Grid")> but still the same, sorts and filter are null.
do I have the correct scripts above?

Thanks

0
Alan Mosley
Top achievements
Rank 1
answered on 30 Jan 2013, 04:42 PM
OK worked out my problem, for one, a silly mistake, the prefix is in the class methods and not in the controller methods. Send the prefix should be LocationGrid not Grid.
Think much clearer after a sleep/.
Tags
Grid
Asked by
Alan Mosley
Top achievements
Rank 1
Answers by
Daniel
Telerik team
Alan Mosley
Top achievements
Rank 1
Share this question
or