Esempio n. 1
0
        /// <summary>
        ///     Renders the container using controller.
        /// </summary>
        /// <param name="gridDefinition">The grid definition.</param>
        /// <param name="helper">The helper.</param>
        /// <param name="model">The model.</param>
        /// <returns>System.String.</returns>
        /// TODO Edit XML Comment Template for RenderContainerUsingController
        private static string RenderContainerUsingController(
            IMvcGridDefinition gridDefinition,
            HtmlHelper helper,
            ContainerRenderingModel model)
        {
            var controllerContext = helper.ViewContext.Controller
                                    .ControllerContext;

            var vdd = new ViewDataDictionary(model);
            var tdd = new TempDataDictionary();

            using (var sw = new StringWriter())
            {
                var viewResult = ViewEngines.Engines.FindPartialView(
                    controllerContext,
                    gridDefinition.ContainerViewPath);

                var viewContext = new ViewContext(
                    controllerContext,
                    viewResult.View,
                    vdd,
                    tdd,
                    sw);

                viewResult.View.Render(viewContext, sw);

                viewResult.ViewEngine.ReleaseView(
                    controllerContext,
                    viewResult.View);

                return(sw.GetStringBuilder().ToString());
            }
        }
Esempio n. 2
0
        /// <summary>
        ///     Gets the base page HTML.
        /// </summary>
        /// <param name="helper">The helper.</param>
        /// <param name="gridName">Name of the grid.</param>
        /// <param name="grid">The grid.</param>
        /// <param name="pageParameters">The page parameters.</param>
        /// <returns>System.String.</returns>
        /// TODO Edit XML Comment Template for GetBasePageHtml
        public string GetBasePageHtml(
            HtmlHelper helper,
            string gridName,
            IMvcGridDefinition grid,
            object pageParameters)
        {
            var preload = "";

            if (grid.QueryOnPageLoad &&
                grid.PreloadData)
            {
                try
                {
                    preload = RenderPreloadedGridHtml(
                        helper,
                        grid,
                        gridName,
                        pageParameters);
                }
                catch (Exception ex)
                {
                    var showDetails = ConfigUtility
                                      .GetShowErrorDetailsSetting();

                    if (showDetails)
                    {
                        var detail = "<div class='alert alert-danger'>";

                        detail += HttpUtility.HtmlEncode(ex.ToString())
                                  .Replace("\r\n", "<br />");

                        detail += "</div>";
                        preload = detail;
                    }
                    else
                    {
                        preload = grid.ErrorMessageHtml;
                    }
                }
            }

            var baseGridHtml =
                MvcGridHtmlGenerator.GenerateBasePageHtml(
                    gridName,
                    grid,
                    pageParameters);

            baseGridHtml = baseGridHtml.Replace("%%PRELOAD%%", preload);

            var containerRenderingModel = new ContainerRenderingModel
            {
                InnerHtmlBlock = baseGridHtml
            };

            var html =
                RenderContainerHtml(helper, grid, containerRenderingModel);

            return(html);
        }
Esempio n. 3
0
        /// <summary>
        ///     MVCs the grid.
        /// </summary>
        /// <param name="helper">The helper.</param>
        /// <param name="name">The name.</param>
        /// <param name="grid">The grid.</param>
        /// <param name="pageParameters">The page parameters.</param>
        /// <returns>IHtmlString.</returns>
        /// TODO Edit XML Comment Template for MvcGrid
        internal static IHtmlString MvcGrid(
            this HtmlHelper helper,
            string name,
            IMvcGridDefinition grid,
            object pageParameters)
        {
            var ge = new GridEngine();

            var html = ge.GetBasePageHtml(helper, name, grid, pageParameters);

            return(MvcHtmlString.Create(html));
        }
Esempio n. 4
0
        /// <summary>
        ///     Renders the container using rendering engine.
        /// </summary>
        /// <param name="gridDefinition">The grid definition.</param>
        /// <param name="model">The model.</param>
        /// <returns>System.String.</returns>
        /// TODO Edit XML Comment Template for RenderContainerUsingRenderingEngine
        private static string RenderContainerUsingRenderingEngine(
            IMvcGridDefinition gridDefinition,
            ContainerRenderingModel model)
        {
            var renderingEngine = GetRenderingEngineInternal(gridDefinition);

            using (var ms = new MemoryStream())
            {
                using (TextWriter tw = new StreamWriter(ms))
                {
                    renderingEngine.RenderContainer(model, tw);
                }

                return(LocalEncoding.GetString(ms.ToArray()));
            }
        }
Esempio n. 5
0
        /// <summary>
        ///     Generates the client definition json.
        /// </summary>
        /// <param name="gridName">Name of the grid.</param>
        /// <param name="def">The definition.</param>
        /// <param name="pageParameters">The page parameters.</param>
        /// <returns>System.String.</returns>
        /// TODO Edit XML Comment Template for GenerateClientDefinitionJson
        private static string GenerateClientDefinitionJson(
            string gridName,
            IMvcGridDefinition def,
            object pageParameters)
        {
            var sbJson = new StringBuilder();

            sbJson.Append("{");
            sbJson.AppendFormat("\"name\": \"{0}\"", gridName);
            sbJson.Append(",");
            sbJson.AppendFormat("\"qsPrefix\": \"{0}\"", def.QueryStringPrefix);
            sbJson.Append(",");

            var preloadedAlready = def.PreloadData || !def.QueryOnPageLoad;

            sbJson.AppendFormat(
                "\"preloaded\": {0}",
                preloadedAlready.ToString().ToLower());

            sbJson.Append(",");

            sbJson.AppendFormat(
                "\"clientLoading\": \"{0}\"",
                def.ClientSideLoadingMessageFunctionName);

            sbJson.Append(",");

            sbJson.AppendFormat(
                "\"clientLoadingComplete\": \"{0}\"",
                def.ClientSideLoadingCompleteFunctionName);

            sbJson.Append(",");

            sbJson.AppendFormat(
                "\"renderingMode\": \"{0}\"",
                def.RenderingMode.ToString().ToLower());

            sbJson.Append(",");
            sbJson.Append("\"pageParameters\": {");
            sbJson.Append(GenerateJsonPageParameters(pageParameters));
            sbJson.Append("}");
            sbJson.Append("}");
            return(sbJson.ToString());
        }
Esempio n. 6
0
        /// <summary>
        ///     Gets the rendering engine internal.
        /// </summary>
        /// <param name="gridDefinition">The grid definition.</param>
        /// <returns>IMvcGridRenderingEngine.</returns>
        /// <exception cref="Exception"></exception>
        /// TODO Edit XML Comment Template for GetRenderingEngineInternal
        internal static IMvcGridRenderingEngine GetRenderingEngineInternal(
            IMvcGridDefinition gridDefinition)
        {
            var engineName = gridDefinition.DefaultRenderingEngineName;

            if (gridDefinition.RenderingEngines[engineName] == null)
            {
                throw new Exception(
                          $"The requested default rendering engine '{engineName}' was not found.");
            }

            var typeString = gridDefinition.RenderingEngines[engineName].Type;
            var engineType = Type.GetType(typeString, true);

            var renderingEngine =
                (IMvcGridRenderingEngine)Activator.CreateInstance(
                    engineType,
                    true);

            return(renderingEngine);
        }
Esempio n. 7
0
        /// <summary>
        ///     Creates the specified context.
        /// </summary>
        /// <param name="context">The context.</param>
        /// <param name="gridName">Name of the grid.</param>
        /// <param name="grid">The grid.</param>
        /// <param name="options">The options.</param>
        /// <returns>GridContext.</returns>
        /// TODO Edit XML Comment Template for Create
        internal static GridContext Create(
            HttpContext context,
            string gridName,
            IMvcGridDefinition grid,
            QueryOptions options)
        {
            var httpContext = new HttpContextWrapper(context);
            var urlHelper   =
                new UrlHelper(new RequestContext(httpContext, new RouteData()));

            var gridContext = new GridContext
            {
                GridName           = gridName,
                CurrentHttpContext = context,
                GridDefinition     = grid,
                QueryOptions       = options,
                UrlHelper          = urlHelper
            };

            return(gridContext);
        }
Esempio n. 8
0
        /// <summary>
        ///     Renders the container HTML.
        /// </summary>
        /// <param name="helper">The helper.</param>
        /// <param name="grid">The grid.</param>
        /// <param name="containerRenderingModel">
        ///     The container
        ///     rendering model.
        /// </param>
        /// <returns>System.String.</returns>
        /// <exception cref="InvalidOperationException"></exception>
        /// <exception cref="Exception">
        ///     When rendering a container, you must output
        ///     Model.InnerHtmlBlock inside the container (Raw).
        /// </exception>
        /// TODO Edit XML Comment Template for RenderContainerHtml
        private static string RenderContainerHtml(
            HtmlHelper helper,
            IMvcGridDefinition grid,
            ContainerRenderingModel containerRenderingModel)
        {
            var container = containerRenderingModel.InnerHtmlBlock;

            switch (grid.RenderingMode)
            {
            case RenderingMode.RenderingEngine:
                GetRenderingEngineInternal(grid);
                container = RenderContainerUsingRenderingEngine(
                    grid,
                    containerRenderingModel);
                break;

            case RenderingMode.Controller:
                if (!string.IsNullOrWhiteSpace(grid.ContainerViewPath))
                {
                    container = RenderContainerUsingController(
                        grid,
                        helper,
                        containerRenderingModel);
                }
                break;

            default: throw new InvalidOperationException();
            }

            if (!container.Contains(containerRenderingModel.InnerHtmlBlock))
            {
                throw new Exception(
                          "When rendering a container, you must output Model.InnerHtmlBlock inside the container (Raw).");
            }

            return(container);
        }
        /// <summary>
        ///     Parses the options.
        /// </summary>
        /// <param name="grid">The grid.</param>
        /// <param name="httpRequest">The HTTP request.</param>
        /// <returns>QueryOptions.</returns>
        /// TODO Edit XML Comment Template for ParseOptions
        public static QueryOptions ParseOptions(
            IMvcGridDefinition grid,
            HttpRequest httpRequest)
        {
            var qsKeyPage = grid.QueryStringPrefix + QueryStringSuffixPage;
            var qsKeySort = grid.QueryStringPrefix + QueryStringSuffixSort;

            var qsKeyDirection = grid.QueryStringPrefix
                                 + QueryStringSuffixSortDir;

            var qsKeyEngine = grid.QueryStringPrefix + QueryStringSuffixEngine;

            var qsKeyPageSize = grid.QueryStringPrefix
                                + QueryStringSuffixItemsPerPage;

            var qsColumns = grid.QueryStringPrefix + QueryStringSuffixColumns;

            var options = new QueryOptions();

            if (httpRequest.QueryString[qsKeyEngine] != null)
            {
                var re = httpRequest.QueryString[qsKeyEngine];
                options.RenderingEngineName = re;
            }

            if (!grid.Paging)
            {
                options.ItemsPerPage = null;
                options.PageIndex    = null;
            }
            else
            {
                options.ItemsPerPage = grid.ItemsPerPage;

                if (grid.AllowChangingPageSize)
                {
                    if (httpRequest.QueryString[qsKeyPageSize] != null)
                    {
                        if (int.TryParse(
                                httpRequest.QueryString[qsKeyPageSize],
                                out int pageSize))
                        {
                            options.ItemsPerPage = pageSize;
                        }
                    }

                    if (grid.MaxItemsPerPage.HasValue &&
                        grid.MaxItemsPerPage.Value < options.ItemsPerPage)
                    {
                        options.ItemsPerPage = grid.MaxItemsPerPage.Value;
                    }
                }

                if (options.ItemsPerPage <= 0)
                {
                    options.ItemsPerPage = 20;
                }

                options.PageIndex = 0;
                if (httpRequest.QueryString[qsKeyPage] != null)
                {
                    if (int.TryParse(
                            httpRequest.QueryString[qsKeyPage],
                            out int pageNum))
                    {
                        options.PageIndex = pageNum - 1;
                        if (options.PageIndex < 0)
                        {
                            options.PageIndex = 0;
                        }
                    }
                }
            }

            if (grid.Filtering)
            {
                var filterableColumns =
                    grid.GetColumns().Where(p => p.EnableFiltering);

                foreach (var col in filterableColumns)
                {
                    var qsKey = grid.QueryStringPrefix + col.ColumnName;

                    if (httpRequest.QueryString[qsKey] == null)
                    {
                        continue;
                    }

                    var filterValue = httpRequest.QueryString[qsKey];

                    if (!string.IsNullOrWhiteSpace(filterValue))
                    {
                        options.Filters.Add(col.ColumnName, filterValue);
                    }
                }
            }

            if (!grid.Sorting)
            {
                options.SortColumnName = null;
                options.SortColumnData = null;
                options.SortDirection  = SortDirection.Unspecified;
            }
            else
            {
                options.SortColumnName = null;

                string sortColName = null;
                if (httpRequest.QueryString[qsKeySort] != null)
                {
                    sortColName = httpRequest.QueryString[qsKeySort];
                }

                if (string.IsNullOrWhiteSpace(sortColName))
                {
                    sortColName = grid.DefaultSortColumn;
                }

                var thisSortColName = sortColName.Trim().ToLower();

                var colDef = grid.GetColumns()
                             .SingleOrDefault(
                    p => p.ColumnName.ToLower() == thisSortColName);

                if (colDef != null &&
                    !colDef.EnableSorting)
                {
                    colDef = null;
                }

                if (colDef != null)
                {
                    options.SortColumnName = colDef.ColumnName;
                    options.SortColumnData = colDef.SortColumnData;
                }

                options.SortDirection = grid.DefaultSortDirection;

                if (httpRequest.QueryString[qsKeyDirection] != null)
                {
                    var sortDir = httpRequest.QueryString[qsKeyDirection];

                    if (sortDir.EqualsOrdinalIgnoreCase("dsc"))
                    {
                        options.SortDirection = SortDirection.Dsc;
                    }
                    else if (sortDir.EqualsOrdinalIgnoreCase("asc"))
                    {
                        options.SortDirection = SortDirection.Asc;
                    }
                }
            }

            if (grid.AdditionalQueryOptionNames.Count > 0)
            {
                foreach (var aqon in grid.AdditionalQueryOptionNames)
                {
                    var qsKeyAqo = grid.QueryStringPrefix + aqon;
                    var val      = "";

                    if (httpRequest.QueryString[qsKeyAqo] != null)
                    {
                        val = httpRequest.QueryString[qsKeyAqo];
                    }

                    options.AdditionalQueryOptions.Add(aqon, val);
                }
            }

            if (grid.PageParameterNames.Count > 0)
            {
                foreach (var aqon in grid.PageParameterNames)
                {
                    var qsKeyAqo = QueryStringPrefixPageParameter
                                   + grid.QueryStringPrefix
                                   + aqon;
                    var val = "";

                    if (httpRequest.QueryString[qsKeyAqo] != null)
                    {
                        val = httpRequest.QueryString[qsKeyAqo];
                    }

                    options.PageParameters.Add(aqon, val);
                }
            }


            var gridColumns      = grid.GetColumns().ToList();
            var requestedColumns = new List <ColumnVisibility>();

            if (httpRequest.QueryString[qsColumns] == null)
            {
                requestedColumns.AddRange(
                    gridColumns.Select(
                        gridColumn => new ColumnVisibility
                {
                    ColumnName = gridColumn.ColumnName,
                    Visible    = gridColumn.Visible
                }));
            }
            else
            {
                var cols     = httpRequest.QueryString[qsColumns];
                var colParts = cols.Split(',', ';');

                foreach (var colPart in colParts)
                {
                    if (string.IsNullOrWhiteSpace(colPart))
                    {
                        continue;
                    }

                    var thisColPart = colPart.ToLower().Trim();

                    var gridColumn = gridColumns.SingleOrDefault(
                        p => p.ColumnName.ToLower() == thisColPart);

                    if (gridColumn == null)
                    {
                        continue;
                    }

                    {
                        if (requestedColumns.SingleOrDefault(
                                p => p.ColumnName == gridColumn.ColumnName)
                            == null)
                        {
                            requestedColumns.Add(
                                new ColumnVisibility
                            {
                                ColumnName = gridColumn.ColumnName,
                                Visible    = true
                            });
                        }
                    }
                }
            }

            foreach (var gridColumn in gridColumns)
            {
                var requestedCol =
                    requestedColumns.SingleOrDefault(
                        p => p.ColumnName == gridColumn.ColumnName);

                if (requestedCol == null)
                {
                    requestedCol = new ColumnVisibility
                    {
                        ColumnName = gridColumn.ColumnName,
                        Visible    = false
                    };

                    requestedColumns.Add(requestedCol);
                }

                if (!requestedCol.Visible &&
                    gridColumn.Visible &&
                    !gridColumn.AllowChangeVisibility)
                {
                    requestedCol.Visible = true;
                }
            }

            options.ColumnVisibility.AddRange(requestedColumns);
            return(options);
        }
Esempio n. 10
0
        /// <summary>
        ///     Renders the preloaded grid HTML.
        /// </summary>
        /// <param name="helper">The helper.</param>
        /// <param name="grid">The grid.</param>
        /// <param name="gridName">Name of the grid.</param>
        /// <param name="pageParameters">The page parameters.</param>
        /// <returns>System.String.</returns>
        /// <exception cref="InvalidOperationException"></exception>
        /// TODO Edit XML Comment Template for RenderPreloadedGridHtml
        private static string RenderPreloadedGridHtml(
            HtmlHelper helper,
            IMvcGridDefinition grid,
            string gridName,
            object pageParameters)
        {
            string preload;

            var options =
                QueryStringParser.ParseOptions(
                    grid,
                    HttpContext.Current.Request);

            var pageParamsDict =
                new Dictionary <string, string>(
                    StringComparer.OrdinalIgnoreCase);

            if (pageParameters != null)
            {
                foreach (PropertyDescriptor descriptor in TypeDescriptor
                         .GetProperties(pageParameters))
                {
                    var obj2 = descriptor.GetValue(pageParameters);

                    if (obj2 != null)
                    {
                        pageParamsDict.Add(descriptor.Name, obj2.ToString());
                    }
                }
            }

            if (grid.PageParameterNames.Count > 0)
            {
                foreach (var aqon in grid.PageParameterNames)
                {
                    var val = "";

                    if (pageParamsDict.ContainsKey(aqon))
                    {
                        val = pageParamsDict[aqon];
                    }

                    options.PageParameters[aqon] = val;
                }
            }

            var gridContext = GridContextUtility.Create(
                HttpContext.Current,
                gridName,
                grid,
                options);

            var engine = new GridEngine();

            switch (grid.RenderingMode)
            {
            case RenderingMode.RenderingEngine:
                preload = RenderUsingRenderingEngine(engine, gridContext);
                break;

            case RenderingMode.Controller:
                preload =
                    RenderUsingController(engine, gridContext, helper);
                break;

            default: throw new InvalidOperationException();
            }

            return(preload);
        }
Esempio n. 11
0
        /// <summary>
        ///     Generates the base page HTML.
        /// </summary>
        /// <param name="gridName">Name of the grid.</param>
        /// <param name="def">The definition.</param>
        /// <param name="pageParameters">The page parameters.</param>
        /// <returns>System.String.</returns>
        /// TODO Edit XML Comment Template for GenerateBasePageHtml
        internal static string GenerateBasePageHtml(
            string gridName,
            IMvcGridDefinition def,
            object pageParameters)
        {
            var definitionJson =
                GenerateClientDefinitionJson(gridName, def, pageParameters);

            var sbHtml = new StringBuilder();

            sbHtml.AppendFormat(
                "<div id='{0}' class='{1}'>",
                HtmlUtility.GetContainerHtmlId(gridName),
                HtmlUtility.ContainerCssClass);

            sbHtml.AppendFormat(
                "<input type='hidden' name='MVCGridName' value='{0}' />",
                gridName);

            sbHtml.AppendFormat(
                "<div id='MVCGrid_{0}_JsonData' style='display: none'>{1}</div>",
                gridName,
                definitionJson);

            sbHtml.AppendFormat(
                "<div id='MVCGrid_ErrorMessage_{0}' style='display: none;'>",
                gridName);

            sbHtml.Append(
                string.IsNullOrWhiteSpace(def.ErrorMessageHtml)
                    ? "An error has occured."
                    : def.ErrorMessageHtml);

            sbHtml.Append("</div>");

            var renderLoadingDiv =
                def.GetAdditionalSetting(RenderLoadingDivSettingName, true);

            if (renderLoadingDiv)
            {
                sbHtml.AppendFormat(
                    "<div id='MVCGrid_Loading_{0}' class='text-center' style='visibility: hidden'>",
                    gridName);
                sbHtml.AppendFormat(
                    "&nbsp;&nbsp;&nbsp;<img src='{0}/ajaxloader.gif' alt='{1}' style='width: 15px; height: 15px;' />",
                    HtmlUtility.GetHandlerPath(),
                    def.ProcessingMessage);
                sbHtml.AppendFormat("&nbsp;{0}...", def.ProcessingMessage);
                sbHtml.Append("</div>");
            }

            sbHtml.AppendFormat(
                "<div id='{0}'>",
                HtmlUtility.GetTableHolderHtmlId(gridName));
            sbHtml.Append("%%PRELOAD%%");
            sbHtml.Append("</div>");

            sbHtml.AppendLine("</div>");

            return(sbHtml.ToString());
        }