コード例 #1
0
        /// <summary>
        /// Handles the Delete event of the gPageRoutes control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="RowEventArgs" /> instance containing the event data.</param>
        protected void gPageRoutes_Delete(object sender, RowEventArgs e)
        {
            RockTransactionScope.WrapTransaction(() =>
            {
                PageRouteService pageRouteService = new PageRouteService();
                PageRoute pageRoute = pageRouteService.Get((int)e.RowKeyValue);

                if (pageRoute != null)
                {
                    string errorMessage;
                    if (!pageRouteService.CanDelete(pageRoute, out errorMessage))
                    {
                        mdGridWarning.Show(errorMessage, ModalAlertType.Information);
                        return;
                    }

                    pageRouteService.Delete(pageRoute, CurrentPersonId);
                    pageRouteService.Save(pageRoute, CurrentPersonId);

                    RemovePageRoute(pageRoute);
                }
            });

            BindGrid();
        }
コード例 #2
0
        /// <summary>
        /// Handles the Delete event of the gPageRoutes control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="RowEventArgs" /> instance containing the event data.</param>
        protected void gPageRoutes_Delete(object sender, RowEventArgs e)
        {
            var rockContext = new RockContext();
            PageRouteService pageRouteService = new PageRouteService(rockContext);
            PageRoute        pageRoute        = pageRouteService.Get(e.RowKeyId);

            if (pageRoute != null)
            {
                string errorMessage;
                if (!pageRouteService.CanDelete(pageRoute, out errorMessage))
                {
                    mdGridWarning.Show(errorMessage, ModalAlertType.Information);
                    return;
                }

                pageRouteService.Delete(pageRoute);

                rockContext.SaveChanges();
            }

            BindGrid();
        }
コード例 #3
0
        /// <summary>
        /// Handles the OnSave event of the masterPage control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
        protected void masterPage_OnSave(object sender, EventArgs e)
        {
            Page.Validate(BlockValidationGroup);
            if (Page.IsValid && _pageId.HasValue)
            {
                var rockContext    = new RockContext();
                var pageService    = new PageService(rockContext);
                var routeService   = new PageRouteService(rockContext);
                var contextService = new PageContextService(rockContext);

                var page = pageService.Get(_pageId.Value);

                // validate/check for removed routes
                var editorRoutes       = tbPageRoute.Text.SplitDelimitedValues().Distinct();
                var databasePageRoutes = page.PageRoutes.ToList();
                var deletedRouteIds    = new List <int>();
                var addedRoutes        = new List <string>();

                if (editorRoutes.Any())
                {
                    int?siteId = null;
                    if (page != null && page.Layout != null)
                    {
                        siteId = page.Layout.SiteId;
                    }

                    // validate for any duplicate routes
                    var duplicateRouteQry = routeService.Queryable()
                                            .Where(r =>
                                                   r.PageId != _pageId &&
                                                   editorRoutes.Contains(r.Route));
                    if (siteId.HasValue)
                    {
                        duplicateRouteQry = duplicateRouteQry
                                            .Where(r =>
                                                   r.Page != null &&
                                                   r.Page.Layout != null &&
                                                   r.Page.Layout.SiteId == siteId.Value);
                    }

                    var duplicateRoutes = duplicateRouteQry
                                          .Select(r => r.Route)
                                          .Distinct()
                                          .ToList();

                    if (duplicateRoutes.Any())
                    {
                        // Duplicate routes
                        nbPageRouteWarning.Title       = "Duplicate Route(s)";
                        nbPageRouteWarning.Text        = string.Format("<p>The page route <strong>{0}</strong>, already exists for another page in the same site. Please choose a different route name.</p>", duplicateRoutes.AsDelimited("</strong> and <strong>"));
                        nbPageRouteWarning.Dismissable = true;
                        nbPageRouteWarning.Visible     = true;
                        CurrentTab = "Advanced Settings";

                        rptProperties.DataSource = _tabs;
                        rptProperties.DataBind();
                        ShowSelectedPane();
                        return;
                    }
                }

                // validate if removed routes can be deleted
                foreach (var pageRoute in databasePageRoutes)
                {
                    if (!editorRoutes.Contains(pageRoute.Route))
                    {
                        // make sure the route can be deleted
                        string errorMessage;
                        if (!routeService.CanDelete(pageRoute, out errorMessage))
                        {
                            nbPageRouteWarning.Text = string.Format("The page route <strong>{0}</strong>, cannot be removed. {1}", pageRoute.Route, errorMessage);
                            nbPageRouteWarning.NotificationBoxType = NotificationBoxType.Warning;
                            nbPageRouteWarning.Dismissable         = true;
                            nbPageRouteWarning.Visible             = true;
                            CurrentTab = "Advanced Settings";

                            rptProperties.DataSource = _tabs;
                            rptProperties.DataBind();
                            ShowSelectedPane();
                            return;
                        }
                    }
                }

                // take care of deleted routes
                foreach (var pageRoute in databasePageRoutes)
                {
                    if (!editorRoutes.Contains(pageRoute.Route))
                    {
                        // if they removed the Route, remove it from the database
                        page.PageRoutes.Remove(pageRoute);

                        routeService.Delete(pageRoute);
                        deletedRouteIds.Add(pageRoute.Id);
                    }
                }

                // take care of added routes
                foreach (string route in editorRoutes)
                {
                    // if they added the Route, add it to the database
                    if (!databasePageRoutes.Any(a => a.Route == route))
                    {
                        var pageRoute = new PageRoute();
                        pageRoute.Route = route.TrimStart(new char[] { '/' });
                        pageRoute.Guid  = Guid.NewGuid();
                        page.PageRoutes.Add(pageRoute);
                        addedRoutes.Add(route);
                    }
                }

                int parentPageId = ppParentPage.SelectedValueAsInt() ?? 0;
                if (page.ParentPageId != parentPageId)
                {
                    if (page.ParentPageId.HasValue)
                    {
                        PageCache.Flush(page.ParentPageId.Value);
                    }

                    if (parentPageId != 0)
                    {
                        PageCache.Flush(parentPageId);
                    }
                }

                page.InternalName = tbPageName.Text;
                page.PageTitle    = tbPageTitle.Text;
                page.BrowserTitle = tbBrowserTitle.Text;
                page.BodyCssClass = tbBodyCssClass.Text;

                if (parentPageId != 0)
                {
                    page.ParentPageId = parentPageId;
                }
                else
                {
                    page.ParentPageId = null;
                }

                page.LayoutId = ddlLayout.SelectedValueAsInt().Value;

                int?orphanedIconFileId = null;

                page.IconCssClass = tbIconCssClass.Text;

                page.PageDisplayTitle       = cbPageTitle.Checked;
                page.PageDisplayBreadCrumb  = cbPageBreadCrumb.Checked;
                page.PageDisplayIcon        = cbPageIcon.Checked;
                page.PageDisplayDescription = cbPageDescription.Checked;

                page.DisplayInNavWhen       = ddlMenuWhen.SelectedValue.ConvertToEnumOrNull <DisplayInNavWhen>() ?? DisplayInNavWhen.WhenAllowed;
                page.MenuDisplayDescription = cbMenuDescription.Checked;
                page.MenuDisplayIcon        = cbMenuIcon.Checked;
                page.MenuDisplayChildPages  = cbMenuChildPages.Checked;

                page.BreadCrumbDisplayName = cbBreadCrumbName.Checked;
                page.BreadCrumbDisplayIcon = cbBreadCrumbIcon.Checked;

                page.RequiresEncryption  = cbRequiresEncryption.Checked;
                page.EnableViewState     = cbEnableViewState.Checked;
                page.IncludeAdminFooter  = cbIncludeAdminFooter.Checked;
                page.AllowIndexing       = cbAllowIndexing.Checked;
                page.OutputCacheDuration = tbCacheDuration.Text.AsIntegerOrNull() ?? 0;
                page.Description         = tbDescription.Text;
                page.HeaderContent       = ceHeaderContent.Text;

                // update PageContexts
                foreach (var pageContext in page.PageContexts.ToList())
                {
                    contextService.Delete(pageContext);
                }

                page.PageContexts.Clear();
                foreach (var control in phContext.Controls)
                {
                    if (control is RockTextBox)
                    {
                        var tbContext = control as RockTextBox;
                        if (!string.IsNullOrWhiteSpace(tbContext.Text))
                        {
                            var pageContext = new PageContext();
                            pageContext.Entity      = tbContext.ID.Substring(8).Replace('_', '.');
                            pageContext.IdParameter = tbContext.Text;
                            page.PageContexts.Add(pageContext);
                        }
                    }
                }

                // save page and it's routes
                if (page.IsValid)
                {
                    rockContext.SaveChanges();

                    // remove any routes for this page that are no longer configured
                    foreach (var existingRoute in RouteTable.Routes.OfType <Route>().Where(a => a.PageIds().Contains(page.Id)))
                    {
                        if (!editorRoutes.Any(a => a == existingRoute.Url))
                        {
                            var pageAndRouteIds = existingRoute.DataTokens["PageRoutes"] as List <Rock.Web.PageAndRouteId>;
                            pageAndRouteIds = pageAndRouteIds.Where(p => p.PageId != page.Id).ToList();
                            if (pageAndRouteIds.Any())
                            {
                                existingRoute.DataTokens["PageRoutes"] = pageAndRouteIds;
                            }
                            else
                            {
                                RouteTable.Routes.Remove(existingRoute);
                            }
                        }
                    }

                    // Add any routes that were added
                    foreach (var pageRoute in new PageRouteService(rockContext).GetByPageId(page.Id))
                    {
                        if (addedRoutes.Contains(pageRoute.Route))
                        {
                            var pageAndRouteId = new Rock.Web.PageAndRouteId {
                                PageId = pageRoute.PageId, RouteId = pageRoute.Id
                            };

                            var existingRoute = RouteTable.Routes.OfType <Route>().FirstOrDefault(r => r.Url == pageRoute.Route);
                            if (existingRoute != null)
                            {
                                var pageAndRouteIds = existingRoute.DataTokens["PageRoutes"] as List <Rock.Web.PageAndRouteId>;
                                pageAndRouteIds.Add(pageAndRouteId);
                                existingRoute.DataTokens["PageRoutes"] = pageAndRouteIds;
                            }
                            else
                            {
                                var pageAndRouteIds = new List <Rock.Web.PageAndRouteId>();
                                pageAndRouteIds.Add(pageAndRouteId);
                                RouteTable.Routes.AddPageRoute(pageRoute.Route, pageAndRouteIds);
                            }
                        }
                    }

                    if (orphanedIconFileId.HasValue)
                    {
                        BinaryFileService binaryFileService = new BinaryFileService(rockContext);
                        var binaryFile = binaryFileService.Get(orphanedIconFileId.Value);
                        if (binaryFile != null)
                        {
                            // marked the old images as IsTemporary so they will get cleaned up later
                            binaryFile.IsTemporary = true;
                            rockContext.SaveChanges();
                        }
                    }

                    Rock.Web.Cache.PageCache.Flush(page.Id);

                    string script = "if (typeof window.parent.Rock.controls.modal.close === 'function') window.parent.Rock.controls.modal.close('PAGE_UPDATED');";
                    ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "close-modal", script, true);
                }
            }
        }
コード例 #4
0
        /// <summary>
        /// Handles the OnSave event of the masterPage control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
        protected void masterPage_OnSave(object sender, EventArgs e)
        {
            Page.Validate(BlockValidationGroup);
            if (!Page.IsValid)
            {
                throw new Exception("Page is not valid");
            }

            var rockContext    = new RockContext();
            var pageService    = new PageService(rockContext);
            var routeService   = new PageRouteService(rockContext);
            var contextService = new PageContextService(rockContext);

            int pageId = hfPageId.Value.AsInteger();

            var page = pageService.Get(pageId);

            if (page == null)
            {
                page = new Rock.Model.Page();
                pageService.Add(page);
            }

            // validate/check for removed routes
            var editorRoutes       = tbPageRoute.Text.SplitDelimitedValues().Distinct();
            var databasePageRoutes = page.PageRoutes.ToList();
            var deletedRouteIds    = new List <int>();
            var addedRoutes        = new List <string>();

            if (editorRoutes.Any())
            {
                int?siteId = null;
                if (page != null && page.Layout != null)
                {
                    siteId = page.Layout.SiteId;
                }

                // validate for any duplicate routes
                var duplicateRouteQry = routeService.Queryable()
                                        .Where(r =>
                                               r.PageId != pageId &&
                                               editorRoutes.Contains(r.Route));
                if (siteId.HasValue)
                {
                    duplicateRouteQry = duplicateRouteQry
                                        .Where(r =>
                                               r.Page != null &&
                                               r.Page.Layout != null &&
                                               r.Page.Layout.SiteId == siteId.Value);
                }

                var duplicateRoutes = duplicateRouteQry
                                      .Select(r => r.Route)
                                      .Distinct()
                                      .ToList();

                if (duplicateRoutes.Any())
                {
                    // Duplicate routes
                    nbPageRouteWarning.Title       = "Duplicate Route(s)";
                    nbPageRouteWarning.Text        = string.Format("<p>The page route <strong>{0}</strong>, already exists for another page in the same site. Please choose a different route name.</p>", duplicateRoutes.AsDelimited("</strong> and <strong>"));
                    nbPageRouteWarning.Dismissable = true;
                    nbPageRouteWarning.Visible     = true;
                    CurrentTab = "Advanced Settings";

                    rptProperties.DataSource = _tabs;
                    rptProperties.DataBind();
                    ShowSelectedPane();
                    throw new Exception(string.Format("The page route {0} already exists for another page in the same site.", duplicateRoutes.AsDelimited(" and ")));
                }
            }

            // validate if removed routes can be deleted
            foreach (var pageRoute in databasePageRoutes)
            {
                if (!editorRoutes.Contains(pageRoute.Route))
                {
                    // make sure the route can be deleted
                    string errorMessage;
                    if (!routeService.CanDelete(pageRoute, out errorMessage))
                    {
                        nbPageRouteWarning.Text = string.Format("The page route <strong>{0}</strong>, cannot be removed. {1}", pageRoute.Route, errorMessage);
                        nbPageRouteWarning.NotificationBoxType = NotificationBoxType.Warning;
                        nbPageRouteWarning.Dismissable         = true;
                        nbPageRouteWarning.Visible             = true;
                        CurrentTab = "Advanced Settings";

                        rptProperties.DataSource = _tabs;
                        rptProperties.DataBind();
                        ShowSelectedPane();
                        throw new Exception(string.Format("The page route {0} cannot be removed. {1}", pageRoute.Route, errorMessage));
                    }
                }
            }

            // take care of deleted routes
            foreach (var pageRoute in databasePageRoutes)
            {
                if (!editorRoutes.Contains(pageRoute.Route))
                {
                    // if they removed the Route, remove it from the database
                    page.PageRoutes.Remove(pageRoute);

                    routeService.Delete(pageRoute);
                    deletedRouteIds.Add(pageRoute.Id);
                }
            }

            // take care of added routes
            foreach (string route in editorRoutes)
            {
                // if they added the Route, add it to the database
                if (!databasePageRoutes.Any(a => a.Route == route))
                {
                    var pageRoute = new PageRoute();
                    pageRoute.Route = route.TrimStart(new char[] { '/' });
                    pageRoute.Guid  = Guid.NewGuid();
                    page.PageRoutes.Add(pageRoute);
                    addedRoutes.Add(pageRoute.Route);
                }
            }

            int parentPageId = ppParentPage.SelectedValueAsInt() ?? 0;

            page.InternalName = tbPageName.Text;
            page.PageTitle    = tbPageTitle.Text;
            page.BrowserTitle = tbBrowserTitle.Text;
            page.BodyCssClass = tbBodyCssClass.Text;

            if (parentPageId != 0)
            {
                page.ParentPageId = parentPageId;

                if (page.Id == 0)
                {
                    // newly added page, make sure the Order is correct
                    Rock.Model.Page lastPage = pageService.GetByParentPageId(parentPageId).OrderByDescending(b => b.Order).FirstOrDefault();
                    if (lastPage != null)
                    {
                        page.Order = lastPage.Order + 1;
                    }
                }
            }
            else
            {
                page.ParentPageId = null;
            }

            page.LayoutId = ddlLayout.SelectedValueAsInt().Value;

            int?orphanedIconFileId = null;

            page.IconCssClass = tbIconCssClass.Text;

            page.PageDisplayTitle       = cbPageTitle.Checked;
            page.PageDisplayBreadCrumb  = cbPageBreadCrumb.Checked;
            page.PageDisplayIcon        = cbPageIcon.Checked;
            page.PageDisplayDescription = cbPageDescription.Checked;

            page.DisplayInNavWhen       = ddlMenuWhen.SelectedValue.ConvertToEnumOrNull <DisplayInNavWhen>() ?? DisplayInNavWhen.WhenAllowed;
            page.MenuDisplayDescription = cbMenuDescription.Checked;
            page.MenuDisplayIcon        = cbMenuIcon.Checked;
            page.MenuDisplayChildPages  = cbMenuChildPages.Checked;

            page.BreadCrumbDisplayName = cbBreadCrumbName.Checked;
            page.BreadCrumbDisplayIcon = cbBreadCrumbIcon.Checked;

            page.RequiresEncryption = cbRequiresEncryption.Checked;
            page.EnableViewState    = cbEnableViewState.Checked;
            page.IncludeAdminFooter = cbIncludeAdminFooter.Checked;
            page.AllowIndexing      = cbAllowIndexing.Checked;

            page.CacheControlHeaderSettings = cpCacheSettings.CurrentCacheability.ToJson();

            page.Description   = tbDescription.Text;
            page.HeaderContent = ceHeaderContent.Text;

            // update PageContexts
            foreach (var pageContext in page.PageContexts.ToList())
            {
                contextService.Delete(pageContext);
            }

            page.PageContexts.Clear();
            foreach (var control in phContext.Controls)
            {
                if (control is RockTextBox)
                {
                    var tbContext = control as RockTextBox;
                    if (!string.IsNullOrWhiteSpace(tbContext.Text))
                    {
                        var pageContext = new PageContext();
                        pageContext.Entity      = tbContext.ID.Substring(8).Replace('_', '.');
                        pageContext.IdParameter = tbContext.Text;
                        page.PageContexts.Add(pageContext);
                    }
                }
            }

            // Page Attributes
            page.LoadAttributes();

            Rock.Attribute.Helper.GetEditValues(phPageAttributes, page);

            // save page and it's routes
            if (page.IsValid)
            {
                // use WrapTransaction since SaveAttributeValues does its own RockContext.SaveChanges()
                rockContext.WrapTransaction(() =>
                {
                    rockContext.SaveChanges();

                    page.SaveAttributeValues(rockContext);
                });

                Rock.Web.RockRouteHandler.ReregisterRoutes();

                if (orphanedIconFileId.HasValue)
                {
                    BinaryFileService binaryFileService = new BinaryFileService(rockContext);
                    var binaryFile = binaryFileService.Get(orphanedIconFileId.Value);
                    if (binaryFile != null)
                    {
                        // marked the old images as IsTemporary so they will get cleaned up later
                        binaryFile.IsTemporary = true;
                        rockContext.SaveChanges();
                    }
                }

                string script = "if (typeof window.parent.Rock.controls.modal.close === 'function') window.parent.Rock.controls.modal.close('PAGE_UPDATED');";
                ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "close-modal", script, true);

                hfPageId.Value = page.Id.ToString();
            }
        }