public GridDataProcessorTests()
        {
            valueProvider = new Dictionary <string, ValueProviderResult>();

            context = new Mock <IGridBindingContext>();
            context.Setup(c => c.Prefix(GridUrlParameters.OrderBy)).Returns(GridUrlParameters.OrderBy);
            context.Setup(c => c.Prefix(GridUrlParameters.GroupBy)).Returns(GridUrlParameters.GroupBy);
            context.Setup(c => c.Prefix(GridUrlParameters.CurrentPage)).Returns(GridUrlParameters.CurrentPage);
            context.Setup(c => c.Prefix(GridUrlParameters.Filter)).Returns(GridUrlParameters.Filter);
            context.Setup(c => c.Prefix(GridUrlParameters.Aggregates)).Returns(GridUrlParameters.Aggregates);
            context.Setup(c => c.Prefix(GridUrlParameters.PageSize)).Returns(GridUrlParameters.PageSize);
            context.Setup(c => c.GroupDescriptors).Returns(() => new List <GroupDescriptor>());
            context.Setup(c => c.SortDescriptors).Returns(() => new List <SortDescriptor>());
            context.Setup(c => c.FilterDescriptors).Returns(() => new CompositeFilterDescriptor[] { });

            context.SetupGet(c => c.Controller).Returns(new ControllerTestDouble(valueProvider, new ViewDataDictionary()));
            context.Setup(c => c.PageSize).Returns(10);
            dataProcessor = new GridDataProcessor(context.Object);
        }
        public virtual void OnActionExecuted(ActionExecutedContext filterContext)
        {
            if (!filterContext.HttpContext.Request.IsAjaxRequest())
            {
                return;
            }

            var actionResultAdapter = adapterFactory.Create(filterContext.Result);

            if (actionResultAdapter == null)
            {
                return;
            }

            var dataSource = actionResultAdapter.GetDataSource();

            if (dataSource == null)
            {
                return;
            }

            var total = actionResultAdapter.GetTotal();

            var dataProcessor = new GridDataProcessor(new GridActionBindingContext(EnableCustomBinding, filterContext.Controller, dataSource, total));

            var result = new Dictionary <string, object>();
            var dataTableEnumerable = dataSource as GridDataTableWrapper;

            if (dataTableEnumerable != null && dataTableEnumerable.Table != null)
            {
                result["data"] = dataProcessor.ProcessedDataSource.SerializeToDictionary(dataTableEnumerable.Table);
            }
            else
            {
                result["data"] = dataProcessor.ProcessedDataSource;
            }

            result["total"] = dataProcessor.Total;

            var modelState = actionResultAdapter.GetModelState();

            if (modelState != null && !modelState.IsValid)
            {
                result["modelState"] = SerializeErrors(modelState);
            }

            if (EnableCustomBinding)
            {
                var aggregates = actionResultAdapter.GetAggregates();
                if (aggregates != null)
                {
                    result["aggregates"] = aggregates;
                }
            }
            else
            {
                SerializeAggregateResults(result, dataProcessor.AggregatesResults);
            }

            filterContext.Result = CreateActionResult(result);
        }
        public void OnActionExecuted(ActionExecutedContext filterContext)
        {
            if (filterContext.HttpContext.Request.IsAjaxRequest() &&
                (filterContext.Result is ViewResultBase))
            {
                ViewResultBase actionResult = filterContext.Result as ViewResultBase;

                IGridModel model = actionResult.ViewData.Model as IGridModel;

                if (model == null)
                {
                    return;
                }

                GridActionBindingContext context = new GridActionBindingContext(EnableCustomBinding, filterContext.Controller, model.Data, model.Total);
                GridDataProcessor dataProcessor = new GridDataProcessor(context);

                filterContext.Result = new JsonResult
                {
                    Data = new
                    {
                        data = dataProcessor.ProcessedDataSource,
                        total = dataProcessor.Total
                    }
                };
            }
        }