How To read DataSourceRequest in MVC for filter and sorting
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);
}
}
}
![Shahram](https://i.stack.imgur.com/hlXDt.jpg?s=256&g=1)
Comments
-
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?