/// <summary> /// Renders messages box with given id. /// </summary> /// <param name="html">The HTML helper.</param> /// <param name="id">The messages box id.</param> /// <param name="attributes">The attributes.</param> /// <param name="cssClass">The CSS class.</param> /// <returns> /// Html string with rendered messages box. /// </returns> /// <exception cref="CmsException">Unable to generate messages box.;Controller should inherit CmsControllerBase class.</exception> /// <exception cref="System.NotSupportedException">Controller should inherit CmsControllerBase class.</exception> private static IHtmlString MessagesBox(this HtmlHelper html, string id, IDictionary <string, string> attributes, string cssClass) { CmsControllerBase controller = html.ViewContext.Controller as CmsControllerBase; if (controller == null) { throw new CmsException("Unable to generate messages box.", new NotSupportedException("Controller should inherit CmsControllerBase class.")); } StringBuilder sb = new StringBuilder(); sb.AppendFormat("<div class=\"{0}\"", cssClass); if (!string.IsNullOrEmpty(id)) { sb.Append(" id=\"" + id + "\""); } if (attributes != null) { foreach (var pair in attributes) { sb.AppendFormat(" {0}=\"{1}\"", pair.Key, pair.Value); } } sb.AppendLine(">"); AddMessagesBoxBlock(sb, "bcms-success-messages", controller.Messages.Success); AddMessagesBoxBlock(sb, "bcms-info-messages", controller.Messages.Info); AddMessagesBoxBlock(sb, "bcms-warning-messages", controller.Messages.Warn); AddMessagesBoxBlock(sb, "bcms-error-messages", controller.Messages.Error); sb.AppendLine("</div>"); return(new MvcHtmlString(sb.ToString())); }
/// <summary> /// Renders the view to string. /// </summary> /// <param name="controller">The controller.</param> /// <param name="viewName">Name of the view.</param> /// <param name="model">The model.</param> /// <param name="enableFormContext">if set to <c>true</c> enable form context.</param> /// <returns>View, rendered to string</returns> public static string RenderViewToString(this CmsControllerBase controller, string viewName, object model, bool enableFormContext = false) { if (string.IsNullOrEmpty(viewName) || viewName.ToLower() == controller.ControllerContext.RouteData.GetRequiredString("action").ToLower()) { var areaName = controller.ControllerContext.RouteData.GetRequiredString("area"); var controllerName = controller.ControllerContext.RouteData.GetRequiredString("controller"); var actionName = controller.ControllerContext.RouteData.GetRequiredString("action"); viewName = string.Format("~/Areas/{0}/Views/{1}/{2}.cshtml", areaName, controllerName, actionName); } controller.ViewData.Model = model; using (var sw = new StringWriter()) { var viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName); var viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw); if (enableFormContext && viewContext.FormContext == null) { viewContext.FormContext = new FormContext(); } viewResult.View.Render(viewContext, sw); viewResult.ViewEngine.ReleaseView(controller.ControllerContext, viewResult.View); return(sw.GetStringBuilder().ToString()); } }
/// <summary> /// Renders page to string recursively - going deep to master pages and layouts. /// </summary> /// <param name="controller">The controller.</param> /// <param name="currentModel">The model.</param> /// <param name="pageModel">The page model.</param> /// <param name="htmlHelper">The HTML helper.</param> /// <returns> /// String builder with updated data /// </returns> private static StringBuilder RenderRecursively(CmsControllerBase controller, RenderPageViewModel currentModel, RenderPageViewModel pageModel, HtmlHelper htmlHelper) { if (currentModel.MasterPage != null) { var renderedMaster = RenderRecursively(controller, currentModel.MasterPage, pageModel, htmlHelper); var pageHtmlHelper = new PageHtmlRenderer.PageHtmlRenderer(renderedMaster, pageModel); foreach (var region in currentModel.Regions) { var contentsBuilder = new StringBuilder(); var projections = currentModel.Contents.Where(c => c.RegionId == region.RegionId).OrderBy(c => c.Order).ToList(); using (new LayoutRegionWrapper(contentsBuilder, region, currentModel.AreRegionsEditable)) { foreach (var projection in projections) { // Add Html using (new RegionContentWrapper(contentsBuilder, projection, currentModel.CanManageContent && currentModel.AreRegionsEditable)) { // Pass current model as view data model htmlHelper.ViewData.Model = pageModel; var content = projection.GetHtml(htmlHelper); contentsBuilder.Append(content); } } } // Insert region to master page var html = contentsBuilder.ToString(); pageHtmlHelper.ReplaceRegionHtml(region.RegionIdentifier, html); } if (currentModel.AreRegionsEditable) { pageHtmlHelper.ReplaceRegionRepresentationHtml(); } renderedMaster = pageHtmlHelper.GetReplacedHtml(); return(renderedMaster); } var newModel = currentModel.Clone(); newModel.Id = pageModel.Id; newModel.PageUrl = pageModel.PageUrl; newModel.Title = pageModel.Title; newModel.MetaTitle = pageModel.MetaTitle; newModel.RenderingPage = pageModel; newModel.Metadata = pageModel.Metadata; newModel.IsReadOnly = pageModel.IsReadOnly; PopulateCollections(newModel, pageModel); var renderedView = RenderViewToString(controller, "~/Areas/bcms-Root/Views/Cms/Index.cshtml", newModel); return(new StringBuilder(renderedView)); }
/// <summary> /// Renders page to string recursively - going deep to master pages and layouts. /// </summary> /// <param name="controller">The controller.</param> /// <param name="currentModel">The model.</param> /// <param name="pageModel">The page model.</param> /// <param name="htmlHelper">The HTML helper.</param> /// <returns> /// String builder with updated data /// </returns> private static StringBuilder RenderRecursively(CmsControllerBase controller, RenderPageViewModel currentModel, RenderPageViewModel pageModel, HtmlHelper htmlHelper) { if (currentModel.MasterPage != null) { var renderedMaster = RenderRecursively(controller, currentModel.MasterPage, pageModel, htmlHelper); var pageHtmlHelper = new PageHtmlRenderer.PageHtmlRenderer(renderedMaster, pageModel); foreach (var region in currentModel.Regions) { var contentsBuilder = new StringBuilder(); var projections = currentModel.Contents.Where(c => c.RegionId == region.RegionId).OrderBy(c => c.Order).ToList(); using (new LayoutRegionWrapper(contentsBuilder, region, currentModel.AreRegionsEditable)) { foreach (var projection in projections) { // Add Html using (new RegionContentWrapper(contentsBuilder, projection, currentModel.CanManageContent && currentModel.AreRegionsEditable)) { // Pass current model as view data model htmlHelper.ViewData.Model = pageModel; var content = projection.GetHtml(htmlHelper); contentsBuilder.Append(content); } } } // Insert region to master page var html = contentsBuilder.ToString(); pageHtmlHelper.ReplaceRegionHtml(region.RegionIdentifier, html); } if (currentModel.AreRegionsEditable) { pageHtmlHelper.ReplaceRegionRepresentationHtml(); } renderedMaster = pageHtmlHelper.GetReplacedHtml(); return renderedMaster; } var newModel = currentModel.Clone(); newModel.Id = pageModel.Id; newModel.PageUrl = pageModel.PageUrl; newModel.Title = pageModel.Title; newModel.MetaTitle = pageModel.MetaTitle; newModel.RenderingPage = pageModel; newModel.Metadata = pageModel.Metadata; newModel.IsReadOnly = pageModel.IsReadOnly; PopulateCollections(newModel, pageModel); var renderedView = RenderViewToString(controller, "~/Areas/bcms-Root/Views/Cms/Index.cshtml", newModel); return new StringBuilder(renderedView); }
/// <summary> /// Renders messages box with given id. /// </summary> /// <param name="html">The HTML helper.</param> /// <param name="id">The messages box id.</param> /// <param name="attributes">The attributes.</param> /// <param name="cssClass">The CSS class.</param> /// <param name="messages">The messages.</param> /// <returns> /// Html string with rendered messages box. /// </returns> /// <exception cref="CmsException">Unable to generate messages box.;Controller should inherit CmsControllerBase class.</exception> /// <exception cref="System.NotSupportedException">Controller should inherit CmsControllerBase class.</exception> private static IHtmlString MessagesBox(this HtmlHelper html, string id, IDictionary <string, string> attributes, string cssClass, IMessagesIndicator messages = null) { CmsControllerBase controller = html.ViewContext.Controller as CmsControllerBase; if (controller == null) { throw new CmsException("Unable to generate messages box.", new NotSupportedException("Controller should inherit CmsControllerBase class.")); } string customCssClass = null; if (attributes != null) { customCssClass = attributes .Where(a => a.Key == "class" && !string.IsNullOrWhiteSpace(a.Value)) .Select(a => string.Format(" {0}", a.Value)) .FirstOrDefault(); } StringBuilder sb = new StringBuilder(); sb.AppendFormat("<div class=\"{0} {1}\"", cssClass, customCssClass); if (!string.IsNullOrEmpty(id)) { sb.Append(" id=\"" + id + "\""); } if (attributes != null) { foreach (var pair in attributes) { if (pair.Key != "class") { sb.AppendFormat(" {0}=\"{1}\"", pair.Key, pair.Value); } } } sb.AppendLine(">"); if (messages == null) { messages = controller.Messages; } AddMessagesBoxBlock(sb, "bcms-success-messages", messages.Success); AddMessagesBoxBlock(sb, "bcms-info-messages", messages.Info); AddMessagesBoxBlock(sb, "bcms-warning-messages", messages.Warn); AddMessagesBoxBlock(sb, "bcms-error-messages", messages.Error); sb.AppendLine("</div>"); return(new MvcHtmlString(sb.ToString())); }
/// <summary> /// Renders the page to string. /// </summary> /// <param name="controller">The controller.</param> /// <param name="renderPageViewModel">The render page view model.</param> /// <returns>Renders page to string</returns> public static string RenderPageToString(this CmsControllerBase controller, RenderPageViewModel renderPageViewModel) { var htmlHelper = GetHtmlHelper(controller); return(RenderRecursively(controller, renderPageViewModel, renderPageViewModel, htmlHelper).ToString()); }