EnableCustomBinding problems with sort and filter

4 posts, 0 answers
  1. Alan Mosley
    Alan Mosley avatar
    200 posts
    Member since:
    Apr 2010

    Posted 27 Jan 2013 Link to this post

    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

  2. Daniel
    Admin
    Daniel avatar
    2118 posts

    Posted 30 Jan 2013 Link to this post

    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!
  3. UI for ASP.NET MVC is VS 2017 Ready
  4. Alan Mosley
    Alan Mosley avatar
    200 posts
    Member since:
    Apr 2010

    Posted 30 Jan 2013 Link to this post

    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

  5. Alan Mosley
    Alan Mosley avatar
    200 posts
    Member since:
    Apr 2010

    Posted 30 Jan 2013 Link to this post

    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/.
Back to Top
UI for ASP.NET MVC is VS 2017 Ready