How To read DataSourceRequest in MVC for filter and sorting

12,064

Solution 1

I Found An Answer By Reading Request Like This:

foreach (var item in request.Filters)
                {
                    if (item is Kendo.Mvc.CompositeFilterDescriptor)
                    {
                        var result = Gatherfileds((Kendo.Mvc.CompositeFilterDescriptor) item);
                        foreach (var filterDescriptor in result)
                        {
                            listoffilters.Add(filterDescriptor);
                        }
                    }
                    if (item is Kendo.Mvc.FilterDescriptor)
                    {
                        var descriptor = (Kendo.Mvc.FilterDescriptor)item;
                        listoffilters.Add(descriptor);
                    }
                }

and Gatherfileds is a method which works Exactly same as Foreach to read all Items

 private List<FilterDescriptor> Gatherfileds(Kendo.Mvc.CompositeFilterDescriptor filteritem)
    if (item is Kendo.Mvc.CompositeFilterDescriptor)
                    {
                        var result = Gatherfileds((Kendo.Mvc.CompositeFilterDescriptor) item);
                        foreach (var filterDescriptor in result)
                        {
                            listoffilters.Add(filterDescriptor);
                        }
                    }

Solution 2

This solution works well and is a little clearer and more concise:

private List<Kendo.Mvc.FilterDescriptor> GetAllFilterDescriptors(DataSourceRequest request)
{
   var allFilterDescriptors = new List<Kendo.Mvc.FilterDescriptor>();
   RecurseFilterDescriptors(request.Filters, allFilterDescriptors);
   return allFilterDescriptors;
}

private void RecurseFilterDescriptors(IList<Kendo.Mvc.IFilterDescriptor> requestFilters, List<Kendo.Mvc.FilterDescriptor> allFilterDescriptors)
{
    foreach (var filterDescriptor in requestFilters)
    {
        if (filterDescriptor is Kendo.Mvc.FilterDescriptor)
        {
            allFilterDescriptors.Add((Kendo.Mvc.FilterDescriptor)filterDescriptor);
        }
        else if (filterDescriptor is Kendo.Mvc.CompositeFilterDescriptor)
        {
            RecurseFilterDescriptors(((Kendo.Mvc.CompositeFilterDescriptor)filterDescriptor).FilterDescriptors, allFilterDescriptors);
        }
    }
}
Share:
12,064
Shahram
Author by

Shahram

Looking For Change ....!

Updated on July 23, 2022

Comments

  • Shahram
    Shahram almost 2 years

    I use kendo grid MVC in my asp.net mvc application and in read of grid i use this model

    public ActionResult Read([DataSourceRequest] DataSourceRequest request, string sWorkPeriodId, string eWorkPeriodId, string personId)
    

    and in general i use this code to execute my query and return data to grid

    var dataLists = fdata.ToDataSourceResult(request);
    

    fdata is:

    var fdata = _session.Query<WfTask>();
    

    but in other cases like this one i don't have queryable i have to get data from a api service and use list :

    var profile = JsonConvert.DeserializeObject<IEnumerable<PersonDetailInfoViewModel>>(resultApi);
    
      var result=(from t in  flowData join personDetailInfoViewModel in profile on t.wfhistory.Actor.Id equals personDetailInfoViewModel.PersonId orderby  t.wfhistory.StepNo)
    

    so what's wrong with second one, second one if I don't have filtering of grid or sorting in detasource request I have to retrieve all profile data and use result.ToDataSourceResult(request); which makes my query slow because data on profile is more than 18000 and for each request I have to get them all but if I have filters and sorts in request object I can read less data As a Result the speed of query increases.so who can i pars data of DataSourceRequest to send as a parameter to api?