performance optimization to mitigate page bloat caused by Blazor serializing/encrypting state when crossing render mode boundaries
This commit is contained in:
		| @ -10,6 +10,7 @@ | ||||
| @inject IStringLocalizer<SharedResources> SharedLocalizer | ||||
| @inject IPageModuleService PageModuleService | ||||
| @inject IModuleService ModuleService | ||||
| @inject IPageService PageService | ||||
|  | ||||
| @if (_initialized) | ||||
| { | ||||
| @ -313,8 +314,9 @@ | ||||
|                     .Select(md => md.PageId) | ||||
|                     .Distinct(); | ||||
|  | ||||
|                 // Filter and retrieve the corresponding pages | ||||
|                 _pagesWithModules = PageState.Pages | ||||
|                 // retrieve the pages which contain the module | ||||
|                 var pages = await PageService.GetPagesAsync(PageState.Site.SiteId); | ||||
|                 _pagesWithModules = pages | ||||
|                     .Where(pg => distinctPageIds.Contains(pg.PageId) && pg.IsDeleted == false) | ||||
|                     .ToList(); | ||||
|  | ||||
|  | ||||
| @ -3,6 +3,7 @@ | ||||
| @inherits ModuleBase | ||||
| @inject NavigationManager NavigationManager | ||||
| @inject IThemeService ThemeService | ||||
| @inject IPageService PageService | ||||
| @inject IModuleService ModuleService | ||||
| @inject IPageModuleService PageModuleService | ||||
| @inject IStringLocalizer<Settings> Localizer | ||||
| @ -79,14 +80,13 @@ | ||||
|                                 } | ||||
|                                 else | ||||
|                                 { | ||||
|                                     foreach (Page p in PageState.Pages) | ||||
|                                     foreach (Page p in _pages) | ||||
|                                     { | ||||
|                                         if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, p.PermissionList)) | ||||
|                                         { | ||||
|                                             <option value="@p.PageId">@(new string('-', p.Level * 2))@(p.Name)</option> | ||||
|                                         } | ||||
|                                     } | ||||
|  | ||||
|                                 } | ||||
|                             </select> | ||||
|                         </div> | ||||
| @ -154,10 +154,12 @@ | ||||
|     private DateTime modifiedon; | ||||
|     private DateTime? _effectivedate = null; | ||||
|     private DateTime? _expirydate = null; | ||||
|     private List<Page> _pages; | ||||
|  | ||||
|     protected override void OnInitialized() | ||||
|     protected override async Task OnInitializedAsync() | ||||
|     { | ||||
|         SetModuleTitle(Localizer["ModuleSettings.Title"]); | ||||
|  | ||||
|         _module = ModuleState.ModuleDefinition.Name; | ||||
|         _title = ModuleState.Title; | ||||
|         _moduleSettingsTitle = Localizer["ModuleSettings.Heading"]; | ||||
| @ -173,8 +175,8 @@ | ||||
|         modifiedon = ModuleState.ModifiedOn; | ||||
|         _effectivedate = Utilities.UtcAsLocalDate(ModuleState.EffectiveDate); | ||||
|         _expirydate = Utilities.UtcAsLocalDate(ModuleState.ExpiryDate); | ||||
|          | ||||
|          | ||||
|         _pages = await PageService.GetPagesAsync(PageState.Site.SiteId); | ||||
|  | ||||
|         if (ModuleState.ModuleDefinition != null) | ||||
|         { | ||||
|             _permissionNames = ModuleState.ModuleDefinition?.PermissionNames; | ||||
|  | ||||
| @ -26,7 +26,7 @@ | ||||
|                             <div class="col-sm-9"> | ||||
|                                 <select id="parent" class="form-select" value="@_parentid" @onchange="(e => ParentChanged(e))" required> | ||||
|                                     <option value="-1"><@Localizer["SiteRoot"]></option> | ||||
|                                     @foreach (Page page in PageState.Pages) | ||||
|                                     @foreach (Page page in _pages) | ||||
|                                     { | ||||
|                                         if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, page.PermissionList)) | ||||
|                                         { | ||||
| @ -213,6 +213,7 @@ | ||||
|     private bool validated = false; | ||||
|     private List<ThemeControl> _themes = new List<ThemeControl>(); | ||||
|     private List<ThemeControl> _containers = new List<ThemeControl>(); | ||||
|     private List<Page> _pages; | ||||
|     private int _pageId; | ||||
|     private string _name; | ||||
|     private string _parentid = "-1"; | ||||
| @ -243,6 +244,8 @@ | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             _pages = await PageService.GetPagesAsync(PageState.Site.SiteId); | ||||
|  | ||||
|             if (PageState.QueryString.ContainsKey("id")) | ||||
|             { | ||||
|                 _pageId = Int32.Parse(PageState.QueryString["id"]); | ||||
| @ -263,7 +266,7 @@ | ||||
|                 _containers = ThemeService.GetContainerControls(PageState.Site.Themes, _themetype); | ||||
|                 _containertype = PageState.Site.DefaultContainerType; | ||||
|                 _children = new List<Page>(); | ||||
|                 foreach (Page p in PageState.Pages.Where(item => (_parentid == "-1" && item.ParentId == null) || (item.ParentId == int.Parse(_parentid)))) | ||||
|                 foreach (Page p in _pages.Where(item => (_parentid == "-1" && item.ParentId == null) || (item.ParentId == int.Parse(_parentid)))) | ||||
|                 { | ||||
|                     if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, p.PermissionList)) | ||||
|                     { | ||||
| @ -293,7 +296,7 @@ | ||||
|         { | ||||
|             _parentid = (string)e.Value; | ||||
|             _children = new List<Page>(); | ||||
|             foreach (Page p in PageState.Pages.Where(item => (_parentid == "-1" && item.ParentId == null) || (item.ParentId == int.Parse(_parentid)))) | ||||
|             foreach (Page p in _pages.Where(item => (_parentid == "-1" && item.ParentId == null) || (item.ParentId == int.Parse(_parentid)))) | ||||
|             { | ||||
|                 if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, p.PermissionList)) | ||||
|                 { | ||||
| @ -371,7 +374,7 @@ | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         Page parent = PageState.Pages.FirstOrDefault(item => item.PageId == page.ParentId); | ||||
|                         Page parent = _pages.FirstOrDefault(item => item.PageId == page.ParentId); | ||||
|                         if (parent.Path == string.Empty) | ||||
|                         { | ||||
|                             page.Path = Utilities.GetFriendlyUrl(parent.Name) + "/" + Utilities.GetFriendlyUrl(_path); | ||||
| @ -382,7 +385,6 @@ | ||||
|                         } | ||||
|                     } | ||||
|  | ||||
|                     var _pages = await PageService.GetPagesAsync(PageState.Site.SiteId); | ||||
|                     if (_pages.Any(item => item.Path == page.Path)) | ||||
|                     { | ||||
|                         AddModuleMessage(string.Format(Localizer["Message.Page.Exists"], _path), MessageType.Warning); | ||||
| @ -402,11 +404,11 @@ | ||||
|                             page.Order = 0; | ||||
|                             break; | ||||
|                         case "<": | ||||
|                             child = PageState.Pages.Where(item => item.PageId == _childid).FirstOrDefault(); | ||||
|                             child = _pages.Where(item => item.PageId == _childid).FirstOrDefault(); | ||||
|                             page.Order = child.Order - 1; | ||||
|                             break; | ||||
|                         case ">": | ||||
|                             child = PageState.Pages.Where(item => item.PageId == _childid).FirstOrDefault(); | ||||
|                             child = _pages.Where(item => item.PageId == _childid).FirstOrDefault(); | ||||
|                             page.Order = child.Order + 1; | ||||
|                             break; | ||||
|                         case ">>": | ||||
|  | ||||
| @ -31,7 +31,7 @@ | ||||
|                                 <div class="col-sm-9"> | ||||
|                                         <select id="parent" class="form-select" value="@_parentid" @onchange="(e => ParentChanged(e))" required> | ||||
|                                             <option value="-1"><@Localizer["SiteRoot"]></option> | ||||
|                                             @foreach (Page page in PageState.Pages) | ||||
|                                             @foreach (Page page in _pages) | ||||
|                                             { | ||||
|                                                 if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, page.PermissionList) && page.PageId != _pageId) | ||||
|                                                 { | ||||
| @ -302,6 +302,7 @@ | ||||
|     private bool validated = false; | ||||
|     private List<ThemeControl> _themes = new List<ThemeControl>(); | ||||
|     private List<ThemeControl> _containers = new List<ThemeControl>(); | ||||
|     private List<Page> _pages; | ||||
|     private int _pageId; | ||||
|     private string _name; | ||||
|     private string _currentparentid; | ||||
| @ -345,6 +346,7 @@ | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             _pages = await PageService.GetPagesAsync(PageState.Site.SiteId); | ||||
|             _pageId = Int32.Parse(PageState.QueryString["id"]); | ||||
|             _page = await PageService.GetPageAsync(_pageId); | ||||
|             _icons = await SystemService.GetIconsAsync(); | ||||
| @ -360,10 +362,10 @@ | ||||
|                 else | ||||
|                 { | ||||
|                     _parentid = _page.ParentId.ToString(); | ||||
|                     _parent = PageState.Pages.FirstOrDefault(item => item.PageId == _page.ParentId); | ||||
|                     _parent = _pages.FirstOrDefault(item => item.PageId == _page.ParentId); | ||||
|                 } | ||||
|                 _children = new List<Page>(); | ||||
|                 foreach (Page p in PageState.Pages.Where(item => (_parentid == "-1" && item.ParentId == null) || (item.ParentId == int.Parse(_parentid, CultureInfo.InvariantCulture)))) | ||||
|                 foreach (Page p in _pages.Where(item => (_parentid == "-1" && item.ParentId == null) || (item.ParentId == int.Parse(_parentid, CultureInfo.InvariantCulture)))) | ||||
|                 { | ||||
|                     if (p.PageId != _pageId && UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, p.PermissionList)) | ||||
|                     { | ||||
| @ -447,8 +449,8 @@ | ||||
|         { | ||||
|             _parentid = (string)e.Value; | ||||
|             _children = new List<Page>(); | ||||
|             foreach (Page p in PageState.Pages.Where(item => (_parentid == "-1" && item.ParentId == null) || (item.ParentId == int.Parse(_parentid)))) | ||||
|             { | ||||
|             foreach (Page p in _pages.Where(item => (_parentid == "-1" && item.ParentId == null) || (item.ParentId == int.Parse(_parentid)))) | ||||
|         { | ||||
|                 if (p.PageId != _pageId && UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, p.PermissionList)) | ||||
|                 { | ||||
|                     _children.Add(p); | ||||
| @ -549,7 +551,7 @@ | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         Page parent = PageState.Pages.FirstOrDefault(item => item.PageId == _page.ParentId); | ||||
|                         Page parent = _pages.FirstOrDefault(item => item.PageId == _page.ParentId); | ||||
|                         if (parent.Path == string.Empty) | ||||
|                         { | ||||
|                             _page.Path = Utilities.GetFriendlyUrl(parent.Name) + "/" + Utilities.GetFriendlyUrl(_path); | ||||
| @ -560,7 +562,6 @@ | ||||
|                         } | ||||
|                     } | ||||
|  | ||||
|                     var _pages = await PageService.GetPagesAsync(PageState.Site.SiteId); | ||||
|                     if (_pages.Any(item => item.Path == _page.Path && item.PageId != _page.PageId)) | ||||
|                     { | ||||
|                         AddModuleMessage(string.Format(Localizer["Mesage.Page.PathExists"], _path), MessageType.Warning); | ||||
| @ -582,11 +583,11 @@ | ||||
|                                 _page.Order = 0; | ||||
|                                 break; | ||||
|                             case "<": | ||||
|                                 child = PageState.Pages.FirstOrDefault(item => item.PageId == _childid); | ||||
|                                 child = _pages.FirstOrDefault(item => item.PageId == _childid); | ||||
|                                 if (child != null) _page.Order = child.Order - 1; | ||||
|                                 break; | ||||
|                             case ">": | ||||
|                                 child = PageState.Pages.FirstOrDefault(item => item.PageId == _childid); | ||||
|                                 child = _pages.FirstOrDefault(item => item.PageId == _childid); | ||||
|                                 if (child != null) _page.Order = child.Order + 1; | ||||
|                                 break; | ||||
|                             case ">>": | ||||
|  | ||||
| @ -5,11 +5,11 @@ | ||||
| @inject IStringLocalizer<Index> Localizer | ||||
| @inject IStringLocalizer<SharedResources> SharedLocalizer | ||||
|  | ||||
| @if (PageState.Pages != null && UserSecurity.IsAuthorized(PageState.User, RoleNames.Admin)) | ||||
| @if (_pages != null && UserSecurity.IsAuthorized(PageState.User, RoleNames.Admin)) | ||||
| { | ||||
|     <ActionLink Action="Add" Text="Add Page" ResourceKey="AddPage" /> | ||||
|  | ||||
|     <Pager Items="@PageState.Pages.Where(item => !item.IsDeleted)" SearchProperties="Name"> | ||||
|     <Pager Items="@_pages.Where(item => !item.IsDeleted)" SearchProperties="Name"> | ||||
|         <Header> | ||||
|         <th style="width: 1px;"> </th> | ||||
|         <th style="width: 1px;"> </th> | ||||
| @ -28,6 +28,21 @@ | ||||
| @code { | ||||
|     public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; | ||||
|  | ||||
|     private List<Page> _pages; | ||||
|  | ||||
|     protected override async Task OnInitializedAsync() | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             _pages = await PageService.GetPagesAsync(PageState.Site.SiteId); | ||||
|         } | ||||
|         catch (Exception ex) | ||||
|         { | ||||
|             await logger.LogError(ex, "Error Loading Pages {Error}", ex.Message); | ||||
|             AddModuleMessage(Localizer["Error.Page.Load"], MessageType.Error); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private async Task DeletePage(Page page) | ||||
|     { | ||||
|         try | ||||
|  | ||||
| @ -4,6 +4,7 @@ | ||||
| @using Microsoft.Extensions.DependencyInjection | ||||
| @inject NavigationManager NavigationManager | ||||
| @inject ISiteService SiteService | ||||
| @inject IPageService PageService | ||||
| @inject ITenantService TenantService | ||||
| @inject IDatabaseService DatabaseService | ||||
| @inject IAliasService AliasService | ||||
| @ -29,7 +30,7 @@ | ||||
|                 <div class="col-sm-9"> | ||||
|                     <select id="homepage" class="form-select" @bind="@_homepageid" required> | ||||
|                         <option value="-"><@SharedLocalizer["Not Specified"]></option> | ||||
|                         @foreach (Page page in PageState.Pages) | ||||
|                         @foreach (Page page in _pages) | ||||
|                         { | ||||
| 							if (UserSecurity.ContainsRole(page.PermissionList, PermissionNames.View, RoleNames.Everyone)) | ||||
| 							{ | ||||
| @ -410,6 +411,7 @@ | ||||
|     private bool _initialized = false; | ||||
|     private List<ThemeControl> _themes = new List<ThemeControl>(); | ||||
|     private List<ThemeControl> _containers = new List<ThemeControl>(); | ||||
|     private List<Page> _pages; | ||||
|     private string _name = string.Empty; | ||||
|     private string _homepageid = "-"; | ||||
|     private string _isdeleted; | ||||
| @ -472,6 +474,8 @@ | ||||
|             Site site = await SiteService.GetSiteAsync(PageState.Site.SiteId); | ||||
|             if (site != null) | ||||
|             { | ||||
|                 _pages = await PageService.GetPagesAsync(PageState.Site.SiteId); | ||||
|  | ||||
|                 _name = site.Name; | ||||
|                 if (site.HomePageId != null) | ||||
|                 { | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 sbwalker
					sbwalker