Esempio n. 1
0
        /// <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()));
        }
Esempio n. 2
0
        /// <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());
            }
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 5
0
        /// <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()));
        }
Esempio n. 6
0
        /// <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());
        }