public override async Task ProcessAsync(TagHelperContext tagContext, TagHelperOutput output)
        {
            if (Context == null)
            {
                throw new Exception("The NccGridContext is null... Please check the reference.");
            }

            _nccTagContext.CssClassGrid            = CssClassTable;
            _nccTagContext.CssClassBody            = CssClassBody;
            _nccTagContext.CssClassHeader          = CssClassHeader;
            _nccTagContext.CssClassFooter          = CssClassFooter;
            _nccTagContext.CssClassHeaderContainer = CssClassHeaderContainer;
            _nccTagContext.CssClassTableContainer  = CssClassTableContainer;
            _nccTagContext.CssClassFooterContainer = CssClassFooterContainer;

            if (!string.IsNullOrEmpty(DataKeys) && DataKeys != Context.DataKeys)
            {
                Context.DataKeys = DataKeys;
            }

            if (RenderForm.HasValue)
            {
                Context.RenderForm = RenderForm.Value;
            }
            if (AutoGenerateEditButton.HasValue)
            {
                Context.AutoGenerateEditButton = AutoGenerateEditButton.Value;
            }
            if (AllowPaging.HasValue)
            {
                Context.AllowPaging = AllowPaging.Value;
            }
            if (Context.AllowPaging)
            {
                if (PagerNavigationSize.HasValue)
                {
                    Context.PagerNavigationSize = PagerNavigationSize.Value;
                }
                if (Context.Filters.ContainsKey("pageSize"))
                {
                    Context.PageSize = Convert.ToInt32(Context.Filters["pageSize"]);
                }
                else if (PageSize.HasValue)
                {
                    Context.PageSize = PageSize.Value;
                }
                if (Context.PageSize == 0 || Context.PageSize == int.MaxValue)
                {
                    Context.PageSize = 10;
                }
            }
            else
            {
                Context.PageSize = int.MaxValue;
            }

            if (Context.Filters.ContainsKey("pageNumber"))
            {
                Context.PageNumber = Convert.ToInt32(Context.Filters["pageNumber"]);
            }

            object service = null;

            if (!string.IsNullOrEmpty(Context.EventHandlerClass))
            {
                service = NccReflectionService.NccGetClassInstance(Context.EventHandlerClass, null);
            }

            service?.NccInvokeMethod(NccEventsEnum.Load.ToString(), new object[] { new NccEventArgs {
                                                                                       NccTagContext = _nccTagContext, NccControlContext = Context, ViewContext = ViewContext
                                                                                   } });

            //Get grid id and share it with siblings parents
            if (string.IsNullOrEmpty(Context.Id))
            {
                Context.Id = Guid.NewGuid().ToString();
            }

            output.TagName = "div";
            output.Attributes.SetAttribute("id", Context.Id);
            output.Attributes.SetAttribute("style", "position:relative");

            if (Context.Visible)
            {
                tagContext.Items.Add(typeof(NccGridContext), Context);

                if (Context.RenderForm)
                {
                    var form = new TagBuilder("form")
                    {
                        TagRenderMode = TagRenderMode.StartTag
                    };

                    output.PreContent.AppendHtml(form);
                }

                NccActionsService.ExtraParameters <NccGridContext> setExtraParameters = GridService.GetExtraParameters;
                NccActionsService.DataResult <NccGridContext>      setDataResult      = GridService.SetDataResult;
                NccControlsService.BindData(Context, ViewContext.HttpContext, setExtraParameters, setDataResult);

                service?.NccInvokeMethod(NccEventsEnum.DataBound.ToString(), new object[] { new NccEventArgs {
                                                                                                NccControlContext = Context, ViewContext = ViewContext, DataObjects = Context.DataObjects
                                                                                            } });

                _nccTagContext.GridHeader = new GridRow {
                    Cells = new List <GridCell>(), CssClass = CssClassHeader
                };

                await output.GetChildContentAsync();

                var tableContainerDiv = new TagBuilder("div");
                if (!string.IsNullOrEmpty(_nccTagContext.CssClassTableContainer))
                {
                    tableContainerDiv.Attributes.Add("class", _nccTagContext.CssClassTableContainer);
                }

                tableContainerDiv.InnerHtml.AppendHtml(GridService.BuildTableHtml(_nccTagContext, Context));

                output.Content.SetHtmlContent(tableContainerDiv);

                if (Context.AllowPaging)
                {
                    output.Content.AppendHtml(GridService.BuildTablePager(_nccTagContext, Context));
                }

                output.PreContent.AppendHtml(_nccTagContext.PreContent);
                output.PostContent.AppendHtml(_nccTagContext.PostContent);

                if (Context.RenderForm)
                {
                    var antiforgeryTag = Generator.GenerateAntiforgery(ViewContext);
                    if (antiforgeryTag != null)
                    {
                        output.PostContent.AppendHtml(antiforgeryTag);
                    }
                    output.PostContent.AppendHtml(new TagBuilder("form")
                    {
                        TagRenderMode = TagRenderMode.EndTag
                    });
                }
            }

            service?.NccInvokeMethod(NccEventsEnum.PreRender.ToString(), new object[] { new NccEventArgs {
                                                                                            NccTagContext = _nccTagContext, NccControlContext = Context, ViewContext = ViewContext
                                                                                        } });

            _nccTagContext.ControlContext = Context;

            output.PostContent.AppendHtml(NccControlsService.GetEncodedContext(_protector, Context.Id, Context));
            output.PostContent.AppendHtml(NccControlsService.GetAjaxLoaderOverlay());
            output.PostContent.AppendHtml(NccControlsService.GetAjaxLoaderImage());
        }