/// <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()); } }
/// <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); }
/// <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)); }
/// <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())); } }
/// <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()); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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( " <img src='{0}/ajaxloader.gif' alt='{1}' style='width: 15px; height: 15px;' />", HtmlUtility.GetHandlerPath(), def.ProcessingMessage); sbHtml.AppendFormat(" {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()); }