public async Task Process()
        {
            //create content
            IHtmlContent res   = null;
            var          model = tag.For.Model as IEnumerable;

            if (model == null)
            {
                res = new HtmlString(string.Empty);
            }
            else
            {
                int i  = 0;
                var sb = new StringWriter();

                foreach (var row in model)
                {
                    var rowType = options.GetServerRow(row);
                    if (rowType == null)
                    {
                        continue;
                    }
                    if (options.Type == GridType.Immediate)
                    {
                        (await rowType.InvokeDisplay(row, RowPrefix(i, rowType), helpers)).WriteTo(sb, HtmlEncoder.Default);
                    }
                    else
                    {
                        (await rowType.InvokeEdit(row, RowPrefix(i, rowType), helpers)).WriteTo(sb, HtmlEncoder.Default);
                    }
                    i++;
                }
                res = new HtmlString(sb.ToString());
            }
            //

            //Create Layout options
            var layoutOptions = new DefaultServerGridLayoutOptions(
                helpers,
                options.Rows,
                options.Toolbars,
                options.LayoutTemplate,
                options.SubTemplates,
                res,
                options.Type,
                options.Id,
                options.FullName,
                options.ErrorMessages ?? defaultMessages,
                options.CssClass,
                tag.Caption,
                tag.LocalizationType,
                tag.QueryFor);
            //

            //Invoke Layout
            var fres = await options.LayoutTemplate.Invoke(tag.For, layoutOptions, helpers);

            output.TagName = string.Empty;
            output.Content.SetHtmlContent(fres);
        }
        public async Task Process()
        {
            //create content
            IHtmlContent res = null;
            var model = tag.For.Model as IEnumerable;
            if (model == null) res = new HtmlString(string.Empty);
            else
            {
                int i = 0;
                var sb = new StringWriter();
                 
                foreach (var row in model)
                {
                    var rowType = options.GetServerRow(row);
                    if (rowType == null) continue;
                    if (options.Type == GridType.Immediate)
                        (await rowType.InvokeDisplay(row, RowPrefix(i, rowType), helpers)).WriteTo(sb, HtmlEncoder.Default);
                    else
                        (await rowType.InvokeEdit(row, RowPrefix(i, rowType), helpers)).WriteTo(sb, HtmlEncoder.Default);
                    i++;
                }
                res = new HtmlString(sb.ToString());
            }
            //

            //Create Layout options
            var layoutOptions = new DefaultServerGridLayoutOptions(
                helpers,
                options.Rows,
                options.Toolbars,
                options.LayoutTemplate,
                options.SubTemplates,
                res,
                options.Type,
                options.Id,
                options.FullName,
                options.ErrorMessages??defaultMessages,
                options.CssClass,
                tag.Caption,
                tag.LocalizationType);
            //

            //Invoke Layout
            var fres = await options.LayoutTemplate.Invoke(tag.For, layoutOptions, helpers);
            output.TagName = string.Empty;
            output.Content.SetHtmlContent(fres);

        }