public override bool OverrideExecuteResult(ControllerContext context)
        {
            if (context.HttpContext.Request.IsAjaxRequest())
            {
                var formProvider = FormProvider ?? ControlFormProvider.DefaultFormProvider();

                // Return data only
                var request = ControlGridFormRequest.Create(context.HttpContext.Request);
                if (request.PageSize <= 0)
                {
                    request.PageSize = DefaultPageSize;
                }

                var response = context.HttpContext.Response;
                response.ContentType     = "application/json";
                response.ContentEncoding = Encoding.UTF8;

                if (context.HttpContext.Request.QueryString["subGrid"] == "1")
                {
                    var id   = context.HttpContext.Request.Form["id"];
                    var data = subGridForm.GetSubGridData(id);
                    WriteJsonData(response, request, data,
                                  data.Count(),
                                  formProvider,
                                  subGridForm.Columns,
                                  subGridForm.GetRowActions(),
                                  x => subGridForm.GetModelId(x), true, false, null, null);
                }
                else
                {
                    var data = FetchAjaxSource(request);
                    WriteJsonData(response, request, data,
                                  data.TotalRecords > 0 ? data.TotalRecords : data.Count,
                                  formProvider,
                                  columns.Select(x => (ControlGridFormColumn)x).ToList(),
                                  rowActions.Count > 0 && !HideActionsColumn ? rowActions.Select(x => (IControlGridFormRowAction)x).ToList() : new List <IControlGridFormRowAction>(),
                                  GetModelId, false, enableTreeGrid, treeGridParentId, treeGridHasChildren);
                }

                return(true);
            }
            return(base.OverrideExecuteResult(context));
        }
        public override bool OverrideExecuteResult(ControllerContext context)
        {
            if (context.HttpContext.Request.IsAjaxRequest())
            {
                // Return data only
                var request = ControlGridFormRequest.Create(context.HttpContext.Request);
                if (request.PageSize <= 0)
                {
                    request.PageSize = DefaultPageSize;
                }
                var data = FetchAjaxSource(request);

                var response = context.HttpContext.Response;
                response.ContentType     = "application/json";
                response.ContentEncoding = Encoding.UTF8;

                using (var writer = new JsonTextWriter(response.Output)
                {
                    Formatting = Formatting.None
                })
                {
                    writer.WriteStartObject();

                    writer.WritePropertyName("iTotalRecords");
                    var totalRecords = data.TotalRecords > 0 ? data.TotalRecords : data.Count;
                    writer.WriteValue(totalRecords);

                    writer.WritePropertyName("aaData");
                    writer.WriteStartArray();

                    var needWriteValueDelimiter = false;
                    foreach (var item in data)
                    {
                        var jsonObject = new JObject();

                        //foreach (var column in columns)
                        //{
                        //    if (column.IsCheckbox)
                        //    {
                        //        throw new NotImplementedException();
                        //    }
                        //    else
                        //    {
                        //        jsonObject.Add(column.PropertyName, Convert.ToString(column.HtmlBuilder(item)));
                        //    }
                        //}

                        //if (rowActions.Count > 0 && !HideActionsColumn)
                        //{
                        //    var sb = new StringBuilder();
                        //    sb.Append("<table style=\"margin-left: auto; margin-right: auto; border: none; padding: 0;\">");
                        //    sb.Append("<tr>");

                        //    var rowActionIndex = -1;
                        //    foreach (var action in rowActions)
                        //    {
                        //        rowActionIndex++;

                        //        if (action.VisibleWhenFunc != null && !action.VisibleWhenFunc(item))
                        //        {
                        //            continue;
                        //        }

                        //        sb.Append("<td style=\"border: none; background-color: transparent; padding: 0 2px;\">");
                        //        if (action.IsSubmitButton)
                        //        {
                        //            var value = action.ValueSelector != null ? action.ValueSelector(item) : null;
                        //            var attributes = new RouteValueDictionary();
                        //            if (!string.IsNullOrEmpty(action.CssClass))
                        //            {
                        //                attributes.Add("class", action.CssClass);
                        //            }

                        //            if (!string.IsNullOrEmpty(action.ConfirmMessage))
                        //            {
                        //                attributes.Add("onclick", string.Format("return confirm('{0}');", action.ConfirmMessage));
                        //            }

                        //            attributes.Add("id", "btn" + Guid.NewGuid().ToString("N").ToLowerInvariant());
                        //            attributes.Add("style", "white-space: nowrap;");

                        //            var tagBuilder = new TagBuilder("button");
                        //            tagBuilder.MergeAttribute("type", "submit");
                        //            tagBuilder.MergeAttribute("name", action.Name);
                        //            tagBuilder.InnerHtml = action.Text;
                        //            tagBuilder.MergeAttribute("value", value);
                        //            tagBuilder.MergeAttributes(attributes);
                        //            sb.Append(tagBuilder.ToString(TagRenderMode.Normal));
                        //        }
                        //        else
                        //        {
                        //            var href = action.UrlBuilder != null ? action.UrlBuilder(item) : null;
                        //            var attributes = new RouteValueDictionary();
                        //            if (!string.IsNullOrEmpty(action.CssClass))
                        //            {
                        //                attributes.Add("class", action.CssClass);
                        //            }

                        //            attributes.Add("style", "white-space: nowrap;");

                        //            if (action.IsShowModalDialog)
                        //            {
                        //                attributes.Add("data-toggle", "modal");
                        //                attributes.Add("data-target", "#dlgRowAction_" + rowActionIndex);
                        //            }

                        //            var tagBuilder = new TagBuilder("a");
                        //            tagBuilder.MergeAttribute("href", href ?? "javascript:void(0)");
                        //            tagBuilder.InnerHtml = action.Text;
                        //            tagBuilder.MergeAttributes(attributes);
                        //            sb.Append(tagBuilder.ToString(TagRenderMode.Normal));
                        //        }
                        //        sb.Append("</td>");
                        //    }

                        //    sb.Append("</tr>");
                        //    sb.Append("</table>");

                        //    jsonObject.Add("_RowActions", sb.ToString());
                        //}
                        //else
                        //{
                        //    jsonObject.Add("_RowActions", null);
                        //}

                        if (needWriteValueDelimiter)
                        {
                            writer.WriteRaw(",");
                        }

                        writer.WriteRaw(jsonObject.ToString());
                        needWriteValueDelimiter = true;
                    }

                    writer.WriteEndArray();

                    writer.WriteEndObject();
                    writer.Flush();
                }

                return(true);
            }
            return(base.OverrideExecuteResult(context));
        }